#include<bits/stdc++.h>
int main()
{
char *c[]={"HELLO","NEW","WORLD","SAYHI"};
char **cp[]={c+3,c+2,c+1,c};
char ***cpp = cp;
printf("%s",**++cpp);
printf("%s",*--*++cpp);
printf("%s",*cpp[-2] + 3);
printf("%s",cpp[-1][-1] + 1);
}
1.char *c[]={“HELLO”,“NEW”,“WORLD”,“SAYHI”};
c数组存的是指向字符串的指针。 *c=“HELLO” ; *(c+1)=“NEW”;
2.char **cp[]={c+3,c+2,c+1,c};
c+3,c+2,c+1,c是字符串的地址。所以cp数组存的是地址的地址。
因为cp本身指向地址,又定义为char **,所以cp是三级指针。
3. char ***cpp = cp;
将三级指针cp赋给cpp,则cpp存的是cp的地址。
1.printf("%s",** ++cpp);
首先执行++cpp,得到cp数组第二个元素的地址;*++cpp,得到cp数组第二个元素的值;**++cpp则为"WORLD"的首地址,输出WORLD。
2.printf("%s",* - -* ++cpp);
++cpp指向cp+2(因为上一语句中已经自加1);*++cpp得到cp数组第三个元素的值;-- *++cpp相当于(c+1)-1得到c; *- - * ++cpp则为"HELLO"首地址,输出"HELLO"。
3.printf("%s",*cpp[-2] + 3);
cpp此时指向cp+2;执行cpp[-2],(cp+2)-2=cp,所以cpp指向cp的首地址;*cpp[-2] = *(c+3) ,即c数组第四个元素的首地址;,*cpp[-2] + 3就得到"HI"的首地址,输出"HI"。
4.printf("%s",cpp[-1][-1] + 1);
cpp此时指向cp+2;cpp[-1],所以cpp指向cp第二个元素的地址; cpp[-1][-1],即 *(c+2)[-1] = *(c+2-1) = *(c+1),得到c数组第二个元素首地址;再+1,所以输出为"EW"。