c语言若有下列说明和语句:int a[4][5], (*p)[5]; p = a; 则对a数组元素

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]是同一个值。

参考资料:

百度百科-数组指针

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-11-27
首先呢,a是二维数组,不解释。
然后呢,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 呢就是第二个元素的地址,*取数据咯。本回答被提问者采纳
第2个回答  2019-07-30
本题中定义了一个二维数组c和一个数组指针p并初始化让它指向c,显然此时p中的各元素为地址,
A中p+1,此时的1代表的长度是整个二维数组c的长度,p+1将让p指向c数组后面的元素,故不能引用c数组中的成员,故选项A错误;同理,选项B和选项C都不正确,
D中p[0]+2代表的是第一行第三个元素的地址,而*(
p[0]+2)将代表第一行第三个元素的值。
第3个回答  2015-06-21
A.表示&a[1].
B.a[3]
C.&a[1][3]
D.a[0][2]