Is
*(ary[3]+8)
and
ary[3][8]
这两者是否相同?如果是,请解释一下如何相同?ary[3]返回的是第一个元素的地址还是ary[3][0]中的值?ary是一个二维数组。
提前致谢。
是的
a[i]
同 *(a+i)
ary[i][j]
同 *( *(ary+i)+j))
a [i] [j]
始终等价于*(*(a + i)+ j)
。 对于真正的2D数组,这也等同于*((T*)a + 3 * i + j)
(其中T
是每个元素的类型)。 - Oliver Charlesworth*(a+i)
必须是指针类型。它是什么类型? - StoryTeller - Unslander MonicaT a[M][N]
,那么*(a+i)
的类型是T[N]
,在大多数情况下会衰减为T*
。 - Oliver Charlesworth*(ary[3]+8)
表示第三行的第八个元素的值。ary[3]
是第三行的基地址。ary[3][8]
也会访问第三行和第八列的同一个元素。
例如,我正在采用一个2行4列的2D数组,它相当于有8个元素的1D数组。如下所示。
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]时,它表示第一行的地址。矩形阵列按行在内存中分配。因此,如果要查找元素a [row] [col]的地址,则会计算为
address = baseAddress + elementSize * (row*(total number of column) + col);
int ary[4][9]
,那么 ary[i]
的值不会被存储在任何地方。编译器知道你的 ary
是一个二维数组,当你执行 ary[i]
时,它会给出你所说的地址。但请注意,以下示例是完全不同的情况:`int *ary[4];
int ary1[9];
int ary2[9];
int ary3[9];
int ary4[9]; ary[0] = ary1;
ary[1] = ary2;
ary[2] = ary3;
ary[3] = ary4;` 尽管你确实也可以称之为二维数组。在这里,指向第二维的指针被明确地存储了。 - ondrejdeex
是一个数组(比如说,int
类型),那么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
*(*(ary+ 3) + 8)
。请注意,ary[3]
与*(ary + 3)
是相同的。这应该回答了你的问题。 - Maroun