带指针的C中的2D数组

时间:2014-08-01 05:20:31

标签: c pointers

我想了解下面的代码输出:

int counter = 0; 
int aMatrix[5][5]; 
register int *aPtr; 
int i, j; 
for (i=0; i<5; i++) 
for (j=0; j<5; j++) 
aMatrix[i][j] = counter++; 
aPtr = &aMatrix[1][1]; printf("%d\n", aPtr[2]);

参考上面的示例代码,执行后&#34; aPtr [2]&#34;的值是多少?

请帮助我理解为什么我得到8作为输出。

3 个答案:

答案 0 :(得分:5)

分配后,矩阵变为:

0 1 2 3 4
5 6 7 8 9
...

使用

aPtr = &aMatrix[1][1];

aPtr[0]aMatrix[1][1]相同,因此aPtr[2]aMatrix[1][3]相同,即矩阵中的8

答案 1 :(得分:1)

for (i=0; i<5; i++) 
for (j=0; j<5; j++) 
aMatrix[i][j] = counter++;

执行for循环后,aMatrix包含 -

aMatrix[0] --> 0  1  2  3  4 
aMatrix[1] --> 5  6  7  8  9
aMatrix[2] --> 10 11 12 13 14
aMatrix[3] --> 15 16 17 18 19
aMatrix[4] --> 20 21 22 23 24

因此aMatrix[1][1]包含6,您要将aMatrix[1][1]的地址指定给aPtr。 那是aPtr[0] = 6aPtr[1] = 7aPtr[2] = 8。所以显然你会得到输出8

答案 2 :(得分:0)

我想补充说多维数组是连续存储在内存中的。声明

int aMatrix[5][5];

由编译器评估为

int (*aMatrix)[5];

所以它是一个指向5个int元素数组的指针。这是你的专栏的大小。 C没有检查边界,编译器也不知道矩阵中有5行。
此外,声明

aPtr = &aMatrix[1][1];

评估为

aPtr = &(*(*(aMatrix + 1) + 1));

因此它需要aMatrix的地址,通过添加1它确实增加了5,因为aMatrix指向5个int。然后,它被解除引用,现在只添加1。然后,另一个dereference和aPtr指向该单元格的地址。
aPtr指向一个int。所以aPtr [2]加上2.总结,5 + 1 + 2 = 8。

aMatrix真正的样子是

aMatrix ---> [0 1 2 3 4] [5 6 7 8 9] [10 11 12 13 14] [15 16 17 18 19] [20 21 22 23 24]
              ^                      |______________|
           aMatrix[0][0]                aMatrix[2]

例如,您可以通过编写以下代码获得相同的输出:

int* testPtr = &aMatrix[0][0];
printf("%d\n",testPtr[8]);