Может кто-нибудь сказать мне поток ссылок во втором утверждении printf в данном коде? - PullRequest
0 голосов
/ 09 января 2011
#include <stdio.h>
char *c[]={"ENTNG", "NST","AMAZI","FIRBE"};
char** cp[]={c+3, c+2, c+1, c};
char ***cpp= cp;
int main() {
    printf("%s",**++cpp);
    printf("%s ",*--*++cpp+3);
    printf("%s",*cpp[-2]+3);
    printf("%s",cpp[-1][-1]+1);
}

Ответы [ 3 ]

4 голосов
/ 09 января 2011
 char *c[]= {
              "ENTNG", 
              "NST",
              "AMAZI",
              "FIRBE"
            }; 

*c[] соответствует символу, поэтому c [] указывает на символы, а c - массив указателей на символ. Элементы c были инициализированы так, чтобы указывать на массивы символов

"ENTNG", "NST", "AMAZI" and "PIRBE"

.

char** cp[]={c+3, c+2, c+1, c};

**cp[] соответствует символу, *cp[] - указатель на символ, а cp [] - указатель на указатель на символ. Таким образом, cp представляет собой массив указателей на указатель на символ. Элементы cp были инициализированы так, чтобы указывать на элементы c.

char ***cpp= cp;

***cpp указывает на символ, **cpp указывает на символ, *cpp указывает на указатель на символ, а cpp указывает на указатель на указатель на символ.

*(*(++cpp));         // Increment cpp and then follow the pointers 

Op : "AMAZI"

(*(--(*(++cpp))))+3; // Increment cpp,follow  the pointer to cp[2],
                     // decrement cp[2],follow  the pointer to  c[0],
                     // index  3 from  the address in  c[0].

Op : "NG "

(*(cpp[-2]))+3;      // Indirectly reference  - 2  from cpp yielding cp[0],
                     // follow  the pointer to c[3]; 
                     // index  3 from  the address in  c[3].

Op : "BE"

(cpp[-1][-1])+1      // Indirectly reference -1 from cpp yielding cp [1],
                     // indirectly reference  - 1 from 
                     // cp[1] yielding  c[1],index  1 from  the address in c[1].

Op : "ST"

Вывод будет AMAZING BEST


Источник: Книга-загадка С

1 голос
/ 09 января 2011

Ну, выход «УДИВИТЕЛЬНЫЙ ЛУЧШИЙ».

Вы можете проверить порядок оценки, используя таблицу приоритетов оператора для C .

0 голосов
/ 03 июля 2014
cout << (**++cpp) ;
// **++cpp =:= **(cpp = cp+1) =:= *(c+2) =:= "AMAZI"
// side-effect: cpp -> cp+1
cout << (*--*++cpp+3) << " ";
// *--*++cpp+3 =:= *--*(cpp = cp+2)+3 =:= *--(cp+2)+3 =:= *(cp[2] = c)+3 =:= "NG"
// side-effect: cpp -> cp+2, cp => {c+3, c+2, c, c}
cout << (*cpp[-2]+3);
// *cpp[-2]+3 =:= **(cp+2-2)+3 =:= *(c+3)+3 =:= "BE", thus print "BE"
cout << (cpp[-1][-1]+1) << endl;
// cpp[-1][-1]+1 =:= *(*(cp+2-1)-1)+1 =:= *(c+2-1)+1 =:= "ST"
return 0;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...