为什么printf中的不同数组解除引用会产生相同的输出?

时间:2017-03-11 21:29:13

标签: c arrays pointers

为什么所有三个打印语句都提供相同的输出?

#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;
}

1 个答案:

答案 0 :(得分:2)

首先,你是“幸运的”,因为你使用了错误的格式说明符printf,所有三个都打印相同的东西。您应该使用%p来打印指针。使用错误的格式说明符会调用undefined behavior

话虽这么说,你打印的所有三个指针都有相同的值。

在第一个语句中,您传入一个数组。将数组传递给函数时,它会衰减为指向第一个元素的指针。

对于第二个语句,您将获取数组的地址。数组的地址与第一个元素的地址相同,因此这将打印与第一个元素相同的值。

第三个语句首先获取数组的地址,产生类型为int (*)[5]的指针,即指向5个int的数组的指针。然后取消引用此指针,为您提供一个数组。与第一个语句一样,此数组在传递给函数时衰减为指向第一个元素的指针,因此该值与第一个元素(以及第二个)相同。