作业帮 > 数学 > 作业

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

来源:学生作业帮 编辑:作业帮 分类:数学作业 时间:2024/05/20 11:16:43
二维数组中,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是有实际的存储的。