二维数组中,a+i表示第i行的地址,那为什么*(a+i)也表示第i行的地址。

如题所述

a+i和*(a+i)的值相同没错,但它们的类型不一样,代表的意义也不一样。a+i还是2维指针,*(a+i)则是一维指针。编译器对它们的解析和操作是不一样的。追问

麻烦您解释一下具体是怎样不同的吧

追答

例如下面定义:

int a[10][10];

对于a+i来说,其实它的类型还是二维数组,所以a+i+j的地址,实际会比a+i的值大j*10*sizeof(int),而(*(a+i))+j比*(a+i)的值大j*sizeof(int)

这就是明显的不同。

也可以理解为a+x的值跟(*a)+x这样的操作的步长是不一样的,因为它们的类型不一样,同样,sizeof(a+i)跟sizeof(*(a+i))也是不一样的。

追问

*(*(a+i)+j)表示a[i][j], a+i表示第i行首地址a[i],这我理解,那*(a+i)+j不就是获得指针a+i所向的数值再加j吗?关键是*(a+i)+j这怎么理解?

追答a+i == &a[i]
*(a+i) == a[i]
*(a+i)+j == a[i]+j == &a[i][j]
不能把*(a+i)理解为是a+i所指向的数值,为什么呢?因为a+i这个指针实际是没有一个内存单元来存储的,它是常量指针,它的所有计算都是由编译器来处理的,不需要内存存储。它跟2维指针是不一样的。例如:
int* ap[10];
这里的ap+i是有实际的存储的。

温馨提示:内容为网友见解,仅供参考
第1个回答  2020-02-05
二维数组每行的首地址分别为a[0],a[1]……a[i],*(a+0)是a[0],*(a+1)是a[1]……*(a+i)是a[i]。a+i是地址,但不代表第i行的首地址a[i]。

二维数组中,a+i表示第i行的地址,那为什么*(a+i)也表示第i行的地址。
a+i和*(a+i)的值相同没错,但它们的类型不一样,代表的意义也不一样。a+i还是2维指针,*(a+i)则是一维指针。编译器对它们的解析和操作是不一样的。

数组*(a+1)的作用是什么?
所以*(a+i)表示的是第i行的行首地址,所谓行首地址,也就是该行的数组成员的首地址。是可以等同的视为&a[i][0]的。所以,这里的*(a+1)代表第一行的数组成员的首地址。第一行数组成员为{3,4},所以*(a+1)也就指向&a[1][0],也就是这里的3这个数组成员的地址 ...

...上说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是二维...

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

二维数组中*(a+i)是什么意思
在C语言中规定,数组名代表的是数组首元素地址。a是二维数组的数组名,因此,在二维数组中*(a+i)表示的是第i+1行0列元素的地址,即a[i][0]的地址。而a+i表示的是第i+1行的首地址。

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

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

...二维数组@a[i][j]的地址为什么可以表示成*(a+i)+j难道*(a+i)还表 ...
a是一个二维数组,a[i]表示其中的一行,是个一维数组,a[i][j]表示一行里面的一个元素。(a+i)就是a[i],是一个一维数组,当然表示一个地址,表示这个一维数组里面的第一个元素a[i][0]的地址。

为什么.一个数组元素a[i]与a+i的表示等价?
只有a是二维数组时,a[i]与a+i才等价,他们都表示第i行的首地址,且类型相同。当a为一维数组时,他们并不等价。

a[5][6]是个二维数组,要表示a[i][j]的地址
a表示一个二维数据,a+i表示的是a[i]的地址,*(a+i)表示a[i][0]的地址,然后*(a+i)+j才表示a[i][j]的地址。a表示二维,加*表示一维,所以要加*。

相似回答