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

学习 时间:2026-04-01 18:31:10 阅读:7384
二维数组中,a+i表示第i行的地址,那为什么*(a+i)也表示第i行的地址.

最佳回答

拼搏的烤鸡

默默的羊

2026-04-01 18:31:10

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是有实际的存储的。

最新回答共有2条回答

  • 迅速的火
    回复
    2026-04-01 18:31:10

    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是有实际的存储的。

上一篇 求一篇英文周记要带中文,今天就得有.

下一篇 一个神经细胞有什么构成,神经细胞如何工作?