我想了解下面的代码输出:
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作为输出。
答案 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] = 6
,aPtr[1] = 7
和aPtr[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]);