为什么数组变量等于其地址?

时间:2016-10-06 15:28:50

标签: c arrays

我是C编程的新手,有一个困扰我的问题。 让我们看看以下代码:

int main()
{
   int arr[3]={1,2,3};
   printf("%d\n", arr);
   printf("%d", &arr);
}

如果我运行此代码,它会为arr和& arr提供相同的结果。但为什么arr =& arr? 我在这个主题上看到了很多答案,但对我来说都不是很清楚。简而言之,人们同意数组变量保存数组的第一个元素的地址,例如,arr保存arr [0]的地址,比如arr = 4340.然后变量arr必须存储在内存中的某个地方并且& arr是存储值4340的存储单元的地址。如果& arr = arr则表明4340存储在地址4340.但地址4340的值是数组的第一个元素的值,所以它应该是1 ??? 我在这一点上非常困惑,非常感谢你的帮助。

2 个答案:

答案 0 :(得分:4)

这里的混淆与数组指针的等价性有关。也就是说,数组不是指针,但在某些情况下,数组衰减为指针。

数组将地址保存到第一个元素,但是是基类型的一组连续元素。数组本身的地址恰好是第一个元素的地址。

指针和数组之间差异很大的一个地方是sizeof运算符可以区分它。假设int是4个字节而指针是8个字节,sizeof(arr)将给你12个,而sizeof(&arr)将给你8个。

当你将arr传递给一个函数时,它会衰减成指向第一个元素的指针。因此,打印arr&arr将为您提供相同的值。

话虽如此,您应该始终使用%p来打印指针而不是%d,因为这会导致未定义的行为。

答案 1 :(得分:2)

您的程序的行为是 undefined 。您不能使用%d作为数组类型的格式说明符或数组类型的地址。您可以通过arr[0]来获取该数组中第一个元素的值。

偶尔arr会将衰减转换为int*类型的指针,例如将其传递给函数时。 arr&arr作为printf参数的上下文中,格式说明符更正为%p时,if (typeof(jQuery) !== undefined) { //do something } 等于U+25B6的事实也是由于指针衰减造成的。