二维数组中,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是有实际的存储的。
再问: 麻烦您解释一下具体是怎样不同的吧
再答: 例如下面定义: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是有实际的存储的。
在二维数组a[ i ][ j ]中*(a+i)表示第i行的首地址,为什么不是表示第i行首元素呢?
假如a[i][j]表示一个二维数组,那a[i]表示的是什么?是a[i][j]的第i行所有元素吗?
请问 *(a+i) =i ; 是什么意思? a+i 表示数组元素地址 a+i =i 表示把i的值给a+i这个数组元素,那
C语言中 二维数组@a[i][j]的地址为什么可以表示成*(a+i)+j难道*(a+i)还表示一个地址的值?求高手详细解
二维数组a[10][10]的第i行第i列的值可以表示为*(*a+i*10+j) 这句话 怎么理解
C中 用指针表示一个二维数组中任意的元素 书上写是a【i】【j】=(*p+m*i+j) m是数组的第二维的维数
【动态二维数组】 p[i*n+j]为什么表示数组元素的值
.int a[]={1,2,3,4,5,6,7,8,9,10},*p=a.i; 则下列能够正确表示数组元素地址的是( )
将一个二维数组行和列的元素交换这个代码中,b[j][i]=a[i][j]
用C语言求7阶矩阵的行列式,求代码…… (矩阵定义在数组a[7][7]中)a[i][j]表示矩阵第i+1行,j+1列元素
C语言二维数组a[i][j],为什么a[1]和*(a+1)等价啊?*(a+1)为什么会是一个地址?弄糊涂了,
java中二维数组b[i].length表示什么意思