使用指针访问二维数组

时间:2013-07-02 07:04:35

标签: c arrays pointers

 *(ary[3]+8)

 ary[3][8]

是一样的吗?如果是,请解释如何? ary [3]返回第一个元素的地址或者ary [3] [0]中的值? ary是一个二维数组。

提前致谢。

4 个答案:

答案 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