c - 为什么 scanf() 不将 array 和 &array 视为相同的?

标签 c arrays pointers scanf fread

我写了这个简单的程序

#include <stdio.h>

int main(void)
{
    int array[10];

    printf("sizeof(array):  %lu\n", sizeof(array));
    printf("sizeof(&array): %lu\n", sizeof(&array));

    printf("array:          %p\n", array);
    printf("&array:         %p\n", &array);

    printf("value:          ");
    scanf("%d", array); // 1
    //scanf("%d, &array"); // 2
}

输出:

sizeof(array):  40
sizeof(&array): 8
array:          0x7fffaab6f480
&array:         0x7fffaab6f480
value:          10

当我使用1时它会编译。但是,当我使用2时却没有!

我收到此编译警告

warning: format ‘%d’ expects argument of type ‘int *’, but argument 2 has type 
‘int (*)[10]’ [-Wformat=]
  scanf("%d", &array);
  ^

尽管 array&array 具有相同的值,但它们的大小不同(分别为 408)在我的系统上。

另一方面,这段代码

int array[10];
fread(&array, x, y, z);

编译并完美运行

int array[10];
fread(array, x, y, z);

我在警告消息中注意到 &array 的类型为 int (*)[10]。这是什么意思?

我也相信我对 fread() 没有任何问题,因为它接受 void *,但是 scanf() 呢?它如何区分指针类型?

为什么它不将 array 视为 &array 即使它们实际上具有相同的值?

最佳答案

数组会衰减为指针,因此使用数组作为参数与将指针传递给第一个元素相同。

当你执行&array时,你得到的是一个指向数组的指针(int (*)[10]),而不是一个指向整数的指针.

关于c - 为什么 scanf() 不将 array 和 &array 视为相同的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24574838/

相关文章:

arrays - 如何使用 assertArrayEquals 比较两个对象数组

ios - 在 swift 3 中避免数组重复

c - 斐波那契修正黑客排名

c - LB_ADDSTRING 消息后 Win32 列表框未立即更新

C#:四舍五入时将数组打印到控制台行

c++ - 使用C++动态分配多维结构数组

C - 带有函数指针的结构体,如何修复 "variable number of arguments"警告?

c - 如何从cgo到exe

c - 结构对齐

c++ - Boost 共享指针数组