我是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 ??? 我在这一点上非常困惑,非常感谢你的帮助。
答案 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
的事实也是由于指针衰减造成的。