C语言中使用scanf读取字符串为何无需添加&符号?
为什么scanf读取字符串时不需要给数组名加&?
这本质是C语言里数组名的隐式指针转换特性导致的,和scanf的参数要求刚好匹配:
- 先看你熟悉的int/float类型:比如
int num;,变量num本身是存储数值的内存空间,scanf("%d", &num)里的&num是取这个内存空间的地址(类型为int*),scanf需要这个地址才能把输入的数值写入num的位置。 - 但对于字符数组
char name[20];,情况不一样:当你在代码中直接使用name时,它会自动转换成指向数组第一个元素的指针,也就是等价于&name[0],类型是char*——而scanf("%s")格式符正好需要一个char*类型的地址,用来存储输入的字符串(scanf会自动在输入的字符末尾添加结束符'\0')。
你可以用一段代码验证这个等价性:
#include <stdio.h> int main() { char name[20]; printf("name的地址:%p\n", name); printf("&name[0]的地址:%p\n", &name[0]); return 0; }
运行后会发现两个地址完全相同,说明name确实就是第一个元素的地址。
如果强行给数组名加&,比如scanf("%s", &name),得到的是指向整个数组的指针(类型为char (*)[20]),和scanf("%s")要求的char*类型不匹配,虽然部分编译器可能会强制转换,但这属于不符合标准的写法,容易引发未定义行为,绝对不要这么做。
回到你的示例代码,直接写scanf("%s", name)是完全合法的,因为name已经是符合要求的指针地址了。
内容的提问来源于stack exchange,提问作者SpaciousCoder78
相关产品推荐
相关产品推荐

