C语言指针问题

程序如下
int _tmain(int argc, _TCHAR* argv[])
{
int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};
int *p=&a[0][0];
int *pa[3];
int **pp;
pa[0]=a[0];
pa[1]=a[0]+1;
pa[2]=a[0]+2;
pp=pa;
printf("%3d",p[2]);
printf("%3d",pp[1][2]);
printf("\n");
return 0;
}
运行结果是3 4 请各位高手指点下是怎么得到的?

pa[0]=a[0];//指的是pa[0]存的是a[0]的地址,也就是1
pa[1]=a[0]+1;//也就是说a[0]地址的下一个,指的是a[0][1]=2
pa[2]=a[0]+2;//同理,指的是a[0][2]=3
pp=pa;//指针赋值,就是交换地址
这样打印pa[2]也就是打印a[0][2]=3
pp[1]指的是a[0][1],那么pp[1][0]就相当于pp[1],这样你就明白pp[1][2]的意思了吧,对,就是pp[1][0]往后数两个,也就是pp[1][2]=a[0][1]往后两个,指的是a[1][0]=4,明白了吗?
温馨提示:答案为网友推荐,仅供参考
第1个回答  2010-06-21
楼上的回答基本上正确的
但是说明的是pa[0]的确存的是a[0]的地址但并不是1,而是他的地址的指向的内容是1,pa[1]指向的是a[0][1],pa[2]指向的啊a[0][2];
然后pp=pa这个时候pp指向的是pa的地址,pp[1]也就是pa[1],其指向的内容即是a[0]+2的内容(即a[0][1]),
所以 pp[1][2]=pa[1]+2=a[0][1+2]=a[0][3],以为数组在内存中是连续存放的a[0][3]存放的数据也就是a[1][0]的数据