自学,谭浩强的C语言书,多维数组指针变量,设有一个二维数组a[3][4],下面是书中原话:
“(2)指向由m个元素组成的一维数组的指针变量。
上例的指针变量p是指向整型变量的,p+1所指向的元素是p所指向的下一元素。可以改用另一方法,使p不是指向整型变量,而是指向一个包含m个元素的一维数组。这时,如果p先指向a[0](即p=&a[0]),则p+1不是指向a[0][1],而是指向a[1],p的增值以一维数组的长度为单位,见图10.28。”————看到这里,似乎说的是p指向的是二维数组a[3][4]的每一行的第一个位置,书中前面举出了一个排长、班长、列兵的例子,那么这里p应该是充当了排长的角色而指向的是班长吗?那么下面又给出了这样一个例子:
main()
{int a[3][4]={1,3,5,7,9,11,13,15,17,19,21,23};
int (*p)[4],i,j;
p=a;
scanf("i=%d,j=%d\n",i,j,*(*(p+i)+j));
}
运行情况如下:
i=1,j=2 /*回车*/
a[1,2]=13
/*程序第3行 int (*p)[4] 表示p是一个指针变量,它指向包含4个元素的一维数组。*/
————那么这里有四个问题:
1 为什么要定义成(*p)[4]而不是(*p)[3]呢?前面不是说了p是指向“班长”也就是每一行的开头的吗?怎么看程序里好像是指向列了呢?
2 第4行代码中 p=a,所赋给p的是什么?是“班长”还是“列兵”?
3 再一个问题就是,为什么要用(*p)[4]这种方式呢?用一个*p,依次指一行中的每一元素,不是一样可以解决问题吗?(*p)[4]到底是什么意思?一开始认为它是一个数组,但书上意思却又说它不是。
以上说得比较多,也不知道大家看明白了没有,总之是感觉很迷惑,还望各位老师及师兄能一一给予详细的解答。多谢。
认真看了各位的回答,就是说,(*p)[4]只能指向一个有4个元素的数组的开头,而如果指向5个元素的数组或者指向其它类型就不行,
(*p)[4]是划分出1个内存单元,叫做指向数组的指针,在它后面加个[4]是为了方便用i*m+j公式计算地址用的。而*p[4]是划分出4个内存单元的数组(叫做指针数组)是吗?
p=a也就是把a里面的值(&a[0])赋给了p
以上是我的理解,不知道是否正确?还希望各位能够指点。