C语言中的二维数组里a+1和*(a+1)为什么都是地址

如题所述

二维数组又包含多个一维数组,a指向第一个一维数组的首地址就还是地址。

a+bai1应该是 (a+0)+1

这里的a是二维数组中的二级指针

数组名为a[0]的一维数组(表示行)

也是数组名为a的一维数组(表示列)

后面的1表示行数组移动1行

0表示列的移动

所以是1行0列的地址

*(a+1)中a是二级指针

取值二级指针是一级指针

一级指针指向的一维数组(二维数组中的行)

一维数组移动一位只能是向下移动也就是行

所以就是 第一行的首地址,也就等于二维数组中,第一行零列的地址。

扩展资料:

二维数组A[m][n],这是一个m行,n列的二维数组。设a[p][q]为A的第一个元素,即二维数组的行下标从p到m+p,列下标从q到n+q,按“行优先顺序”存储时则元素a[i][j]的地址计算为:

LOC(a[i][j]) = LOC(a[p][q]) + ((i − p) * n + (j − q)) * t

按“列优先顺序”存储时,地址计算为:

LOC(a[i][j]) = LOC(a[p][q]) + ((j − q) * m + (i − p)) * t

存放该数组至少需要的单元数为(m-p+1) * (n-q+1) * t 个字节 [1]

参考资料来源:百度百科-二维数组

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2017-10-26
二维数组, int a[10][20];
a是一个指针的指针, 即二级指针.
一个指针加一个数, 当然还是指针(即a+1是指针)
取值一个二级指针, 是一级指针(即指针), 所以还是指针, 不过类型发生了变化.
a+1的类型为int *[10].
而*(a+1)的类型则为int *, 也就是平常的指针.
如果你学习二维数组是用心, 你就会知道不存在二维数组, 二维数组其实是一个包含数组的数组, 即数组的每一个元素还是一个数组(这点有点像面向对象的思维).
所以a[0]就是取第一个元素值, 而第一个元素是数组, 所以其值仍是一个指针.
答了这么多, 一看问题, 发现是"地址".....地址和指针是一个东西.追问

额 没看懂

追答

就比方说, 一头猪吃了一颗草, 然后一条狼把那头猪吃了(整个), 然后人去解剖那只狼, 解剖了一层发现了一头猪, 然后又解剖, 又发现了一颗草.
这和那是一个道理.
int a[10][20], 它定义了一个长度为10的数组, 其中数组中的每个元素又是一个长度为20的数组, 这个数组的每个元素是int型.
还可以理解成一个班里有几组, 然后组再往下的才是人. 一个班是一个集体, 一个组也是一个小集体.

本回答被提问者采纳
第2个回答  2018-08-18
a+1应该是 (a+0)+1
这里的a是二维数组中的二级指针
数组名为a[0]的一维数组(表示行)
也是数组名为a的一维数组(表示列)
后面的1表示行数组移动1行
0表示列的移动
所以是1行0列的地址

*(a+1)中a是二级指针
取值二级指针是一级指针
一级指针指向的一维数组(二维数组中的行)
一维数组移动一位只能是向下移动也就是行,
所以就是 第一行的首地址 也就等于二维数组中 第一行零列的地址
第3个回答  2019-02-20
例如a[5][10];
a + 1的值是第二行的首地址,
* (a + 1)得值也是第二行的首地址,
但是a + 1不等于a[1],而* (a + 1)等于a[1]。
如果给a+1再加1,就是a+1+1,就是a+2,它的值是第三行的首地址
如果给*(a+1)再加1,就是*(a+1)+1,它的值是第二行的第二个地址
他们移动的区别:前者是纵向的,后者是横向的。
指针类型的区别:两者均存放为同一地址,但前者是指向一维数组,后者是指向元素的。
实际就是前者每次跳动4*10个字节,后者每次跳动4个字节。
第4个回答  2020-03-30
二维数组又包含多个一维数组 a指向第一个一维数组的首地址就还是地址