c语言若有下列说明和语句:int a[4][5], (*p)[5]; p = a; 则对a数组元素
A) p+1 B) *(p+3) C) *(p+1)+3 D) *(*p+2)
答案是D。但我不知道为什么,请帮我解释详细一点,谢谢! 展开
如果定义int (*p)[n];p1=a;p1++后,p指向a[1][0];
则p+j将指向a[0]数组中的元素a[0][j]。
由于a[0]、a[1]┅a[M-1]等各个行数组依次连续存储,则对于a数组中的任一元素a[i][j],指针的一般形式如下:
p+i*N+j,相应的如果用p来表示,则为*(p+i)+j;
元素a[i][j]相应的指针表示为:
*( p+i*N+j) ,相应的如果用p1来表示,则为*(*(p+i)+j)。
推出以下的等价关系:
a+i == p+i;
a[i] == p[i] == *(a+i) == *(p+i);
a[i][j] == p[i][j] == *(a[i]+j) == *(p[i]+j) == *(*(a+i)+j) == *(*(p+i)+j)。
扩展资料:
对上述二维数组a,虽然a[0]、a都是数组首地址,但二者指向的对象不同,a[0]是一维数组的名字,它指向的是a[0]数组的首元素,对其进行“*”运算,得到的是一个数组元素值,即a[0]数组首元素值,因此,*a[0]与a[0][0]是同一个值;
而a是一个二维数组的名字,它指向的是它所属元素的首元素,它的每一个元素都是一个行数组,因此,它的指针移动单位是“行”,所以a+i指向的是第i个行数组,即指向a[i]。对a进行“*”运算,得到的是一维数组a[0]的首地址,即*a与a[0]是同一个值。
参考资料:
然后呢,p是一个指针,什么样的指针呢,就是指向一维数组的指针,而且这个一维数组的元素个数呢是5.
然后呢,p=a;就是把p指向a数组。
分析选项:
A p+1 .因为p是一维数组指针,所以p每+1就是+1行。错误。
B *(p+3)是指第4行的首地址,访问不到元素。需要再*
C *(p+1) + 3 对地址+3 没啦意义
D *(*p+2) *p是第0行首地址 +2 呢就是第二个元素的地址,*取数据咯。
A中p+1,此时的1代表的长度是整个二维数组c的长度,p+1将让p指向c数组后面的元素,故不能引用c数组中的成员,故选项A错误;同理,选项B和选项C都不正确,
D中p[0]+2代表的是第一行第三个元素的地址,而*(
p[0]+2)将代表第一行第三个元素的值。
B.a[3]
C.&a[1][3]
D.a[0][2]