指针的指针

来源:百度知道 编辑:UC知道 时间:2024/05/14 07:10:15
char *c[]={"ENTER","NEW","POINT","FIRST"};
char **a[]={c+3,c+2,c+1,c};
char ***b=a;
main()
{ printf("%s",**++b);
printf("%s",*--*++b);
printf("%s",*b[-2]+3);
printf("%s\n",b[-1][-1]+1);
}

问题有三:
1、解释一下**b、*b各指向什么;
2、解释一下*b[-2]是何许东西;
3、上述程序的输出,顺便把运行的过程简述一下;
谢谢,在线等答案,有点急,答完了还有加分!

当指针指向的是数组时,如果太复杂,你可以把它改成数组
c是二维数组,里面有4个字符串,"ENTER","NEW","POINT","FIRST",c是其首地址,指向c[0],c[0]是ENTER的首地址,指向E;如此类推.

a是指向指针的指针的数组,a[0]~a[3]分别和c+3,c+2,c+1,c对应//a[3]=c,所以它指向的是"ENTER","NEW","POINT","FIRST",而不是ENTER;
a是3维的。

再来看b,b=a,所以b就是a,b也是3维的。
**b就是将3维减去2维,也就是1维,是字符串,来看它里面内容:
**b=**a,a指向a[0],*a=a[0],a[0]=c+3,c+3指向c[3],即*(a[0])=*(c+3)=c[3],c[3]="FIRST",所以**b="FIRST"
*b是将3维去1维,剩2维,也就是说它是二维数组,来看它里面的内容:
*b=*a,a指向a[0],*a=a[0],a[0]=c+3,而c+3={"FIRST"};所以*b={"FIRST"};//注意和**b的区别:**b是一串字符,是一维的,*b是n串字符,是二维的,只是这里的n=1罢了
再看*b[-2],*b[-2]是将3维去了2维(数组下标的作用),因而*b[-2]是字符串,再来看其内容:
*b[-2]=*a[-2],先来看a[-2],a[-2]意思是说将取a指针上移两位的内容,在这里只能这么解释,因为在程序里b发生了变化,等到那在解释其内容

***************
现在来看主程序:
1.输出:**++b内容,由运算级且++在左,先做++,此时b=b+1,指向位置上移一位,*++b=a[1],a[1]=c+2,**++b=*(c+2)=c[2]="POINT", 输出:POINT