(*p)[2]二维数组?

求大佬帮忙解释下(*p)[2]为什么是3啊?

通过定义,可以知道:p是一个指针,这个指针指向的是3个一组整数的数据区,当p=a的赋值完成后,p指向a数组的第1组数据即a[0][0],a[0][1],a[0][2],则(*p)[0]就是p[0][0]就是a[0][0],那么(*p)[2]就是p[0][2]就是a[0][2];

如果写(*(p+1))[2]则是p[1][2]也是a[1][2]

温馨提示:答案为网友推荐,仅供参考
第1个回答  2020-08-31
这题有意思,
首先 int a [] [3] = {1,2,3,4,5,6}; 是一个二维数组,但是内存空间中这些数据的存储是连续的。可以理解为 int a [5] = {1,2,3,4,5,6}; a存储的都是数组的首元素地址,区别在于以为一维数组的下标代表的是地址,二维数组下标代表的是行和列的个数。
int (*p)[3]; 这里是用指针的形式 声明一个新的数组,
p = a; 这里把a数组的首元素地址赋给 指针数组,此时新声明的指针数组就指向了a数组,*p就等于a[0];
所以 (*p)[2]等价于a[2] = 3;一维数组下标为二的元素追问

二维数组都可以理解为一维数组来使用吗?

追答

可以啊,二维数组本来就是嵌套的一维数组

本回答被提问者采纳
第2个回答  2020-08-31
C语言中,访问数据时,"[]"操作符实际上就是读取偏移地址内数据的操作符,比如a[b]就是读取从内存a开始往后b个单位的内存的数据,也就是*(a+b),所以*(a+b)和a[b]就是一回事,是等价的。 现在看(*p)[2], *p就是*(p+0),也就是p[0],那(*p)[2]自然就是p[0][2]了,p[0][2]就是3.
第3个回答  2020-08-31
[]和*都有降维作用。如果p是二维指针(或数组),则p[x]或*p降为一维,p[][]或**p降为指向元素。
所以题目中的(*p)降为一维数组后,再[2]就是从一维数组中取第2个元素3了。
最重要的是你得弄清楚p指向哪一个一维数组,以及做类似p+1或p[1]运算时,这个1的跨度有多大(是跨一行还是跨一个元素?),这由当前“p所在的表达式”是几维来决定的
第4个回答  2020-09-03
首先a[][3]={1,2,3,4,5,6}表示将1到6这六个数字按三个数进行分组,即每三个数字为一行形成一个二维数组:第0行是1,2,3;第1行是4,5,6.
因为p=a,则(*p)[2]相当于(*a)[2];
又因为a作为二维数组的首地址(也就是a[0][0]的地址),则*(a+i)表示第一个维度(即第i行)的首地址(即*(a+0)为第0行首地址a[0];*(a+1)为第1行首地址a[1];依此类推)。然后,(*(a+i))[j]即可表示第i行第j列元素的值。
综上所述,(*p)[2]=(*a)[2]=(*(a+0))[2]也就是第0行第2列的值,即3.
相似回答