static int a[2][3]={1,2,3,4,5,6},(*pa)[3];
int i,j;pa=a;
for (i=0;i<2;i++)
for (j=0;j<3;j++)
printf("%3d",pa[i][j]);
}
这个程序输出结果是1 2 3 4 5 6。我不明白的是此处指针定义int (*pa)[3]。这是什么意思。能不能利用这个程序给我详解下这个。谢谢各位
要更正楼上的说法,楼上恰恰说反了*p[3]才是指针数组 而 (*p)[3] 才是数组指针,而且是指向二维数组的指针。
首先说明啊,这个帖子是给菜鸟看的,已经懂得了的朋友看坏了脑袋不要怪我~因为这些方法是我在自己看的时候想出来的~原创~也许还是错误的呢~但是他能帮你很快地理解二维数组的指针怎么用~
首先,为了更加好的向你阐述我的想法,必须要改动一下你的题目:(*pa)[3] 改为(*pa)[2]
main() { static int a[2][3]={1,2,3,4,5,6},(*pa)[2]; int i,j;pa=a; for(i=0;i<2;i++) for(j=0;j<3;j++) printf("%3d",pa[i][j]); }
a[2][3] 的数据想象图 [0] [1] [2] a[0] 1, 2, 3 a[1] 4, 5, 6
(*pa)[2] 的数据想象图 [0] [1] pa[0] 1, 2 pa[1] 3, 4 pa[2] 5, 6
你可以在脑子里面把指针pa这样来看。
然后我们分析一下程序: i=0时: j=0, 输出pa[0][0],也就是1啦 j=1, 输出pa[0][1] 2 j=2, 输出pa[0][2],惨了,我们没有pa[0][2]啊!这个时候,pa[0][2]就要向后推一位,也就是说:pa[0][2]和pa[1][0]是等价的。所以输出3。
i=1时: j=0, 输出pa[1][0],也就是3啦 j=1, 输出pa[1][1] 4 j=2, 输出pa[1][2],通理,由于没有pa[1][2],所以就往后推一位,输出5
整个程序输出的就是 1 2 3 3 4 5
[此贴子已经被作者于2004-07-26 20:37:39编辑过]
然后我们再回过头来看原题目: main() { static int a[2][3]={1,2,3,4,5,6},(*pa)[3]; int i,j;pa=a; for(i=0;i<2;i++) for(j=0;j<3;j++) printf("%3d",pa[i][j]); }
a[2][3] 的数据想象图 [0] [1] [2] a[0] 1, 2, 3 a[1] 4, 5, 6
(*pa)[3] 的数据想象图 [0] [1] [2] pa[0] 1, 2, 3 pa[1] 4, 5, 6
两个的图是一样的,这也是一开始我要改程序的原因——为了更好的理解
然后我们同样分析一下程序: i=0时: j=0, 输出pa[0][0],也就是1啦 j=1, 输出pa[0][1] 2 j=2, 输出pa[0][2], 3 i=1时: j=0, 输出pa[1][0],也就是4啦 j=1, 输出pa[1][1] 5 j=2, 输出pa[1][2], 6
所以,程序输出的就是 1 2 3 4 5 6 啦