[英]2D array in C with pointer
我试图理解下面的代码输出:
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]);
参考上面的示例代码,执行后“ aPtr [2]”的值是什么?
请帮助我理解为什么我得到8作为输出。
分配后,矩阵变为:
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
。
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
。
我想补充一点,多维数组连续存储在内存中。 声明
int aMatrix[5][5];
由编译器评估为
int (*aMatrix)[5];
因此它是一个指向5元素整数数组的指针。 那就是你的专栏的大小。 C不检查边界,编译器也不知道矩阵中有5行。
此外,声明
aPtr = &aMatrix[1][1];
被评估为
aPtr = &(*(*(aMatrix + 1) + 1));
因此它需要aMatrix的地址,通过加1确实增加了5,因为aMatrix指向5个整数。 然后,将其取消引用,现在仅添加1。 然后,另一个取消引用和aPtr指向该单元的地址。
aPtr指向一个整数。 因此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]);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.