是
*(ary[3]+8)
和
ary[3][8]
是相同的 ?如果是,请解释如何?ary[3] 返回第一个元素的地址或 ary[3][0] 中的值?ary 是一个二维数组。
提前致谢。
是的
a[i]
和*(a+i)
ary[i][j]
和*( *(ary+i)+j))
*(ary[3]+8)
表示第三行第 8 列的值。ary[3]
是第三行的基地址。ary[3][8]
还将访问第三行和第 8 列的相同元素。
例如,我采用两行四列的二维数组,相当于 8 个元素的一维数组。如下所示。
int a[8] = {0,1,2,3,4,5,6,7};
int b[2][4] = {{0,1,2,3},{4,5,6,7}};
因为b
是 2D 数组,所以您可以将其视为两个 1D 数组的数组。当您传递 b[1] 或 b[1][0] 时,它表示第一行的地址。如果您在内存中分配了由 Row.so 分配的矩形数组想要找到元素 a[row][col] 的地址,它将被计算为
address = baseAddress + elementSize * (row*(total number of column) + col);
If x
is an array ( int
, say)x[i]
只是*(x+i)
. 在你的情况下,ary
是一个二维数组(再次int
,比如说)。通过相同的语法糖机制,ary[i][j]
等效于*((*(ary+i))+j)
,从中可以清楚地看到引擎盖下发生了什么。
正如其他人已经说过的那样,a[i]
它只是一种糖*(a+i)
。
我只想补充一点,它总是有效的,它允许我们做这样的事情:
char a[10];
char b;
char c[10][20];
// all of these are the same:
b = a[5]; // classic
b = *(a + 5); // pointer shifting
b = 5[a]; // even so!
b = c[5][9];
b = *(c[5] + 9);
b = *(*(c + 5) + 9);
b = *(c + 5)[9];
b = 5[c][9];
b = 5[9][c]; // WRONG! Compiling error