4

这是我编写的用于测试/理解数组中指针行为的代码

int main(void){
    int a[4];
    memset(a, 0, sizeof(a));
    printf("%x %x\n",a,&a);
}
Output of the above program on my machine:
bfeed3e8 bfeed3e8

我不明白为什么值 a 和 &a 是相同的。据我了解 &a 应该给出存储 a 的内存位置的地址。这种行为的解释是什么?

4

8 回答 8

9

&a确实给了你的地址aa给你a,因为它是一个数组,它衰减到一个指向a.

或者学究起来,它衰减为指向a[0].

于 2012-04-20T13:40:43.897 回答
4

在这种情况下,数组名称a衰减为指向其第一个元素的指针。你的意思是

printf("%x %x\n",a[0],&a);
于 2012-04-20T13:40:25.903 回答
1

该表达式&a具有类型int (*)[4](指向 的 4 元素数组的指针int)并计算为数组对象的地址;在这方面,指向数组的指针就像指向其他任何东西的指针。

奇怪的是如何a处理表达式。除非它是sizeof或一元运算符的操作数&,或者是用于在声明中初始化另一个数组的字符串文字,否则“N 元素数组T”类型的表达式将替换为 / 转换为 /“衰减”为类型的表达式T *(指向T),其值是数组中第一个元素的地址。由于数组的地址和数组中第一个元素的地址相同,因此两个表达式产生相同的value,但它们的类型不同。

于 2012-04-20T15:18:16.650 回答
0

数组的名称也指向它所持有的内存块的开始。没什么大不了的。

这些都是等价的:

printf("%x\n",a);
printf("%x\n",&a);
printf("%x\n",&a[0]);
于 2012-04-20T13:42:09.220 回答
0

在指针上下文中,数组衰减为指针。所以a衰减到数组第一个字节&a的地址,定义为第一个字节的地址。可能您想在 printf中使用*aora[0]而不是。&a

于 2012-04-20T13:43:05.783 回答
0
int test[10]         = test is pionter as well as &test

如果您想处理除 base 以外的元素,请使用 &test[4]

顺便提一句

&test = @test[0] = test

所有指向基本元素的指针

于 2012-04-20T13:43:19.357 回答
0

数组名“a”指向数组的第一个元素。

为了更好地理解:

  *(a + 2) is same with a[2].
于 2012-04-20T13:44:05.270 回答
0

在 C 语言中,数组名在这种情况下a被认为是一个标签,它表示数组的地址。对它应用 & 符号被解释为同样的事情。

函数指针也有类似的问题。如果func是指向函数的指针,您可以同时使用func()和调用该函数(*func)()

有间接语法的情况,以特殊方式处理。

于 2012-04-20T13:44:47.210 回答