C语言scanf:为何char变量需传指针,字符串可直接传变量?
关于C语言scanf传参的疑问
我在学习C语言的scanf函数时,遇到了如下代码:
#include <stdio.h> #include <string.h> int main(){ char firstLetter; printf("First letter? "); scanf("%c", &firstLetter); char firstName[20], lastName[20]; printf("What's your name?"); scanf(" %s %s", firstName, lastName); printf("Name: %s %s\n", firstName, lastName); }
我想理解为何第一个scanf需要传入char变量firstLetter的指针,而处理字符串时却可以直接传入变量?
核心原因在于C语言中变量名和数组名的本质区别,以及scanf的传参规则:
scanf的底层要求:
所有scanf的格式参数,本质上都需要接收一个内存地址。因为它要把用户输入的数据直接写入你指定的内存位置,必须知道这个位置在哪里。单个char变量的情况:
char firstLetter是单个字符变量,变量名firstLetter代表的是这个变量存储的值,不是它的内存地址。所以必须用&(取地址运算符)获取它的内存地址,传给scanf后,scanf才能把输入的字符写到这个地址对应的内存里。字符数组(字符串)的情况:
在C语言里,字符数组的数组名本身就等价于数组首元素的地址。比如firstName这个数组名,它直接代表&firstName[0](数组第一个字符的地址)。而%s格式符刚好需要接收一个char*类型的指针(字符首地址),用来存储输入的字符串,所以直接传数组名就满足要求,不需要额外加&。要是给数组名加
&,反而会得到整个数组的地址(类型是char (*)[20]),和%s要求的char*类型不匹配,反而会导致程序出错。
内容的提问来源于stack exchange,提问作者Pol Santha
相关产品推荐
相关产品推荐

