C中数组指针的奇怪行为

时间:2012-04-20 13:38:46

标签: c arrays pointers

这是我编写的代码,用于测试/理解数组

中指针的行为
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的存储位置的地址。 对这种行为有什么解释?

8 个答案:

答案 0 :(得分:9)

&a确实为您提供了a的地址。 a为您提供a,因为它是一个数组,它会衰减到指向a的指针。

或者说是迂腐,它会衰减到指向a[0]的指针。

答案 1 :(得分:4)

在该上下文中,数组名a衰减为指向其第一个元素的指针。你的意思是

printf("%x %x\n",a[0],&a);

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

这些都是等价的:

printf("%x\n",a);
printf("%x\n",&a);
printf("%x\n",&a[0]);

答案 4 :(得分:0)

在指针上下文中,数组衰减为指针。因此a衰减到数组的第一个字节的地址,&a是第一个字节的地址。您可能希望在printf中使用*aa[0]代替&a

答案 5 :(得分:0)

int test[10]         = test is pionter as well as &test

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

BTW

&test = @test[0] = test

所有指向基本元素的指针

答案 6 :(得分:0)

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

为了更好地理解:

  *(a + 2) is same with a[2].

答案 7 :(得分:0)

在C中,数组名称(在本例中为a)被视为标签,表示数组的地址。对它应用放大器被解释为同样的事情。

函数指针存在类似问题。如果func是指向函数的指针,则可以使用func()(*func)()调用该函数。

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

相关问题