我写了这个简单的程序
#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
具有相同的值,但它们的大小不同(分别为 40 和 8)在我的系统上。
另一方面,这段代码
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/