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

2024-11-27 16:28:26
推荐回答(4个)
回答(1):

如果定义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]是同一个值。

参考资料:

百度百科-数组指针

回答(2):

首先呢,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 呢就是第二个元素的地址,*取数据腊行嫌咯。

回答(3):

本题中定义了一个二维数组c和一个数组指针p并初始化让它指向c,显然此时p中的各元素为地址,
A中p+1,此时的1代表的长度是整个二维数组c的中祥长度,p+1将让p指向c数组后面的元素,故不能引用c数组中的成员,故选项A错误;同理,选项B和选项C都悔培羡不正确,
D中p[0]+2代表的是第一行第三碧拍个元素的地址,而*(
p[0]+2)将代表第一行第三个元素的值。

回答(4):

A.表示&a[1].
B.a[3]
C.&a[1][3]
D.a[0][2]