为什么所有三个打印语句都提供相同的输出?
#include <stdio.h>
int main(void) {
int arr[]={1,2,3,4,5};
printf("%d\n",arr);
printf("%d\n",&arr);
printf("%d\n",*(&arr));
return 0;
}
答案 0 :(得分:2)
首先,你是“幸运的”,因为你使用了错误的格式说明符printf
,所有三个都打印相同的东西。您应该使用%p
来打印指针。使用错误的格式说明符会调用undefined behavior。
话虽这么说,你打印的所有三个指针都有相同的值。
在第一个语句中,您传入一个数组。将数组传递给函数时,它会衰减为指向第一个元素的指针。
对于第二个语句,您将获取数组的地址。数组的地址与第一个元素的地址相同,因此这将打印与第一个元素相同的值。
第三个语句首先获取数组的地址,产生类型为int (*)[5]
的指针,即指向5个int的数组的指针。然后取消引用此指针,为您提供一个数组。与第一个语句一样,此数组在传递给函数时衰减为指向第一个元素的指针,因此该值与第一个元素(以及第二个)相同。