【发布时间】:2016-02-19 22:21:23
【问题描述】:
程序:
#include<stdio.h>
int main(void) {
int x[4];
printf("%p\n", x);
printf("%p\n", x + 1);
printf("%p\n", &x);
printf("%p\n", &x + 1);
}
输出:
$ ./a.out
0xbff93510
0xbff93514
0xbff93510
0xbff93520
$
我希望以下是上述程序的输出。例如:
x // 0x100
x+1 // 0x104 Because x is an integer array
&x // 0x100 Address of array
&x+1 // 0x104
但最后一条语句的输出与我预期的不同。 &x 也是数组的地址。所以在这个上加 1
将打印增加 4 的地址。但&x+1 给出的地址增加了 10。为什么?
【问题讨论】:
-
看来 &x+1 给了你数组内存后的地址(4*4=16 or 0x100)...
-
这是您清楚地看到指针和数组之间区别的情况之一。
-
重要说明:这些地址是十六进制的。 “递增 4”也表示 0x4 递增,但 “递增 0x10”表示“递增 16”,而不是到 10 点。
-
@LukePark 实际上应该是 int (*)[4] 类型
-
只是一个注释(与您所问的问题无关):您的程序具有未定义的行为(至少在 C99 下),因为您需要在将指针传递给
void *之前将它们转换为 @987654328 @(因为它是一个可变参数函数)。见Printing pointers in C。
标签: c pointers language-lawyer