繁体   English   中英

C中带有指针的2D数组

[英]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] = 6aPtr[1] = 7aPtr[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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM