是
*(ary[3]+8)
和
ary[3][8]
是一样的吗?如果是,请解释如何? ary [3]返回第一个元素的地址或者ary [3] [0]中的值? ary是一个二维数组。
提前致谢。
答案 0 :(得分:4)
是
a[i]
与*(a+i)
ary[i][j]
与*( *(ary+i)+j))
答案 1 :(得分:1)
*(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
是二维数组,所以你可以将它视为两个一维数组的数组。当你传递b [1]或b [1] [0]时,它表示第一行的地址。分配了矩形数组在Row.so的内存中,如果你想找到元素a [row] [col]的地址,它将被计算为
address = baseAddress + elementSize * (row*(total number of column) + col);
答案 2 :(得分:1)
如果x
是一个数组(int
,请说),x[i]
只是*(x+i)
的语法糖。在您的情况下,ary
是一个二维数组(再次称为int
)。通过相同的句法糖机制,ary[i][j]
相当于*((*(ary+i))+j)
,从中可以清楚地知道幕后发生了什么。
答案 3 :(得分:0)
正如其他人已经说过的那样,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