C语言二维数组&a[3]+4代表什么

假设这个数组是a[5][5],那么&a[3]代表的应该是a[3]这一行数组的首地址,4个步长是4*4*5=80,这样理解对不对,a[3]存储的是a[3][0]的地址,那么&a[3]代表的到底是什么呢

1.
二维数组
a[5][9]
中a[4]指的是a[4][0]的地址,
2.
a[5][9]相当于有5个一位数组每个数组长度为9
3.
a[4]相当于第四个数组的首地址,a[4]
+
1等于a[4][1]
满意请采纳,不懂请追问
温馨提示:答案为网友推荐,仅供参考
第1个回答  2018-04-13
char *p是一维的, str是2维的,p=str,二者不匹配。str[0]是一维的,与p同类型。 a与a[0]只是在使用a的首地址这个值时意义才一样。 a是地址,*a是取a这个地址中存储的一个byte.[看数值类型,如果是整数,则是取整数]追问

我今天想了想,你说的其实是对的,上面一个回答者没有看清楚题目,他以为我是在问一维数组的问题,事实上我问的是二维数组的,但是&a[3]+4和a[5][5]这个数组并不匹配,所以我提问的说法其实根本不成立,而上面的回答者回答的是一维数组的&a[3]+4的答案,假设指针是pa,那么pa=&a[3],&a[3]+4也就是这个指针偏移了4*sizeof(pa),还是感谢你回答这个问题

第2个回答  2018-04-13
二维指针可以分为两层,底层指向数据,第二层指向第一层的指针,也就是指针的指针,a[3]存储就是第4个指针的位置,加上4也就是在第四个指针位置那在偏移4个数据长度追问

你的意思是a是第二层指针,指向a[0],a[0]是第一层指针,指向a[0][0],a[0][0]是底层,指向数据,a[0][0]也是指针吗,数据不是直接存放在a[0][0]中吗

追答

a[0][0]相当于*(*(a+0)+
0)

所以并不是指针

中间还有指针,a是指针的指针

追问

a[3]存储的是&a[3][0],其实和a[3]的实际地址没有关系,那么&a[3]+4实际上是a[3]的地址偏移4个字节,这么想对不对,a[3]的实际地址和a[3][0]的实际地址有没有什么关联

追答

错了,a[3]存的是一个指针的地址,而那个指针指的才是&a[3][0]

错了,不是偏移四位字节了,都溢出了,他那是偏移四个指针

a[3]存的是一个指针,a[3][0]存的是数值

追问

那么&a[3]+4的&a[3]代表的是a[3]的指针的地址,4代表的是偏移4个指针,是这样吗

追答

对了,就相当于&a[7]

int ** a;
a = new int *[M];
for(int i = 0; i < M; i ++)
a[i] = new int[N];
这是动态二维数组的声明,在栈中为了提高速度可能会有优化,但是底层和动态数组的声明原理是一样的

本回答被提问者采纳
第3个回答  2019-11-27
。。。。。。。