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指向第一个一维数组的首地址就还是地址

C语言中的二维数组里a+1和*(a+1)为什么都是地址
一维数组移动一位只能是向下移动也就是行 所以就是 第一行的首地址,也就等于二维数组中,第一行零列的地址。

c语言二维数组与指针,我想知道为什么*(a+1).与显示中的a+1,所给出的...
二维数组是两层指针,这个你该明白 (*(a+i)+j)这个是表示i行的第j个数据,注意啊,是两个 要是不理解,记住套用即可 一个*是指针 所以ij都是指针 a+1是一个指针,表示第1行的首地址(c中数组时从0开始计数的)在二维数组中,a,a[0],&a[0][0]这三个指针虽然都是a的首地址的值,...

c语言中a+i是地址吗,书上说a+i是a[i]的指针,既然这样,那么*(a+i)为什...
a+i其实就是&a[i],肯定是地址 (a+i)其实就是a[i],如果a是二给数组的数组名,a[i]就肯定是地址(等同于&a[i][0]),如果a只是一维数组(指针数组除外)的数组名,a[i]就不是地址(原因是:二维数组可以看作是多个一维数组组成,即数组的数组)(a+i)+j就是&a[i][j],如果数组a是二维...

C语言、二维数组指针中的 * 和 &
我看了你说的这两页,书上的原话是这样的:“在二维数组中,a+i,*(a+i),&a[i],&a[i][0]的值相等,即他们都是同一地址值”,要注意这个字眼“地址值”,也就是说,这几种表达方式并不是内存中存的数值,而是存放数组的地址的值,首先要弄明白,首地址这个概念,如果只写数组名,就代表...

关于二维数组中的一个问题...高手进!
a+1是&a[1],是a[1]的地址,而*(a+1)是a[1],是a[1][0]的地址,因为二者都在数组a[][]的首位置,数值必然是相等的,但是很明显,a[1]和a[1][0]类型是不一样的.换个角度:int i = 0;int *p = 0;那么,能说p等价于i么?不能,虽然数值相同,但是二者的含义却是完全两样的....

在二维数组里 地址a[i]和地址*(a+i)的问题
a[i]和*(a+i) 表示的是同一个地址,对于数组来说,计算机计算地址都是以*(a+i)进行计算,也就是换算成指针的形式.对于二维数组,你要搞清楚所取的地址是对谁而言的.很显然,a[i]是第i行的地址,这是相对于行而言的,也就是说,a[i+1]就是下一行的地址了.&a[i]是不一样的,首先,a[i]是...

*(a+i)与a[i]是一样的地址,为什么?
*(a+i)与a[i]是一样的地址应该是说他们指向的都是同一个内存单元,也就是说*(a+i)指向的值的地址,与a[i]指向的值的地址都是一样的。也就是说他们得到的值是一样的。这里不是说他们得到的是一个内存变量的地址还是内存变量的值,只是说明他们是一样的,得到的值一样,换句话说就是一样的地址。(一样...

c语言中二维数组地址疑问
用指针法表示。a[0]为一维数组名,该一维数组中 序号为1的元素显然可以用a[0]+1来表示,见图6.16。欲得到a[0][1]的值,用地址法怎么表示呢?既然 a[0]+1是a[0][1]元素的地址,那么,*(a[0]+1) 就是 a[0][1]元素的值。而a[0]又是和*(a+0)无条件等价 的,因此也可以用*(...

C语言中 a+1和&a+1的理解
这里的a=&a[0][0];a+1=&a[1][0],也就是过了一个a[0][1],因此是加了8个字节 &a+1是跳过整个数组的地址,也就是加了16字节

C语言地址运算问题
二维数组的各个地址是这样的:比如定义了一个数组a[][],a能够为数组的一行代言,a+1就向后走一行变成a[1]了,也就是a[1][0]的地址,a[i]是以单个的元素为单位进行管理的,那么a[i]+1就是以a[i][0]为起始点向后走一个元素所占的字节数,即a[i][1]的地址。

相似回答