为什么scanf需要&对于int而对于char没有?
int main ()
{
char str [80];
int i;
printf ("Enter your family name: ");
scanf ("%s",str);
printf ("Enter your age: ");
scanf ("%d",&i);
return 0;
}
答案 0 :(得分:1)
scanf()
需要一个指针(内存地址)来扫描数据。虽然str
是一个字符数组,但在表达式中使用str
时(例如,作为scanf的参数),它实际上是指其第一个元素的内存地址。但是,对于int
,您必须明确告诉scanf()
使用其内存地址,这就是您使用&
(地址)运算符的原因。
答案 1 :(得分:1)
因为str
是数组第一项的地址,而i
只是int的名称,&i
表示int i
的地址
答案 2 :(得分:1)
标准库函数scanf()
需要一个与您要读取的数据相对应的指针。所以你总是需要传递一个指针。
在char[]
的情况下,数组名称衰减为指向数组的第一个元素的指针,这就是为什么不对char数组使用&
的原因。实际上,在传递给scanf()时使用&符号(&
)作为char数组是错误的,因为&charArray
的类型是char (*)[N]
而scanf()期望{{1}格式说明符char*
。
如果你有指针,那么你可以直接传递它们。 E.g。
%s
如上所述,你不要在这里使用int *p;
char *c;
p = malloc(sizeof(int)); // one int
c = malloc(100); // 100 bytes
scanf("%d%99s", p, c);
因为参数已经是指针而使用&
是错误的,因为它会使它们指向指针。
因此,只要scanf()的参数不是指向您想要读入的类型的对象的指针,就使用&
。
答案 3 :(得分:0)
str
衰减到一个指针,因为它是一个数组(因此它指向它的第一个元素,这确实不意味着数组和指针是相同的东西)。 i
需要&
,因为scanf
需要存储值的地址,因此需要i
的地址。