【发布时间】:2018-11-26 10:30:04
【问题描述】:
我试图掌握 C 中的指针和数组。现在,我一直在试图弄清楚我的 C 编译器如何为二维数组中的元素分配内存。这是我的示例代码:
#include <stdio.h>
int main(void)
{
int ar[2][2] = { {1, 2}, {3, 4} };
printf("sizeof(int) = %u\n-----\n", sizeof(int));
printf("ar = %p\n", ar);
printf("ar + 1 = %p\n", ar + 1);
printf("&ar = %p\n", &ar);
printf("&ar + 1 = %p\n\n", &ar + 1);
printf("sizeof(ar) = %u\n-----\n", sizeof(ar));
printf("ar[0] = %p\n", ar[0]);
printf("ar[0] + 1 = %p\n", ar[0] + 1);
printf("&ar[0] = %p\n", &ar[0]);
printf("&ar[0] + 1 = %p\n\n", &ar[0] + 1);
printf("sizeof(ar[0]) = %u\n-----\n", sizeof(ar[0]));
printf("ar[1] = %p\n", ar[1]);
printf("ar[1] + 1 = %p\n", ar[1] + 1);
printf("&ar[1] = %p\n", &ar[1]);
printf("&ar[1] + 1 = %p\n\n", &ar[1] + 1);
printf("sizeof(ar[1]) = %u\n-----\n", sizeof(ar[1]));
printf("&ar[0][0] = %p\n", &ar[0][0]);
printf("&ar[0][0] + 1 = %p\n", &ar[0][0] + 1);
printf("&ar[1][0] = %p\n", &ar[1][0]);
printf("&ar[1][0] + 1 = %p\n\n", &ar[1][0] + 1);
printf("sizeof(ar[0][0]) = %u\n-----\n", sizeof(ar[0][0]));
return 0;
}
我在系统上得到的输出是:
sizeof(int) = 4
-----
ar = 0061FF20
ar + 1 = 0061FF28
&ar = 0061FF20
&ar + 1 = 0061FF30
sizeof(ar) = 16
-----
ar[0] = 0061FF20
ar[0] + 1 = 0061FF24
&ar[0] = 0061FF20
&ar[0] + 1 = 0061FF28
sizeof(ar[0]) = 8
-----
ar[1] = 0061FF28
ar[1] + 1 = 0061FF2C
&ar[1] = 0061FF28
&ar[1] + 1 = 0061FF30
sizeof(ar[1]) = 8
-----
&ar[0][0] = 0061FF20
&ar[0][0] + 1 = 0061FF24
&ar[1][0] = 0061FF28
&ar[1][0] + 1 = 0061FF2C
sizeof(ar[0][0]) = 4
-----
我明白为什么ar 的大小是 16 字节;它应该能够容纳 4 个ints,在我的系统上是 4x4 = 16 个字节。我猜这也是为什么&ar + 1 和&ar 之间的字节差是(十六进制)30 - 20 = 16。
我不明白为什么ar + 1 和ar 之间的区别只有8 个字节。这意味着该数组只能容纳 2 个ints á 4 个字节。
我在理解 ar[0] 和 ar[1] 时遇到同样的问题,正如您在我的代码中看到的那样。
ar + 1 和 &ar + 1 不应该产生相同的结果吗?
【问题讨论】:
-
您需要使用 () 来设置优先顺序,[] 在 () 之后的优先级最高,您的表达式不会像现在写的那样是您所期望的。例如。 *ar[0] 与 (*ar)[0] 不同
-
好点,谢谢。但是,在我的代码中,我想要 ar[0] 的地址,用 &ar[0] 还不够,还是应该使用 &(ar[0])?
标签: c arrays memory pointer-arithmetic