You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的传参规则:

  1. scanf的底层要求:
    所有scanf的格式参数,本质上都需要接收一个内存地址。因为它要把用户输入的数据直接写入你指定的内存位置,必须知道这个位置在哪里。

  2. 单个char变量的情况:
    char firstLetter是单个字符变量,变量名firstLetter代表的是这个变量存储的值,不是它的内存地址。所以必须用&(取地址运算符)获取它的内存地址,传给scanf后,scanf才能把输入的字符写到这个地址对应的内存里。

  3. 字符数组(字符串)的情况:
    在C语言里,字符数组的数组名本身就等价于数组首元素的地址。比如firstName这个数组名,它直接代表&firstName[0](数组第一个字符的地址)。而%s格式符刚好需要接收一个char*类型的指针(字符首地址),用来存储输入的字符串,所以直接传数组名就满足要求,不需要额外加&。

    要是给数组名加&,反而会得到整个数组的地址(类型是char (*)[20]),和%s要求的char*类型不匹配,反而会导致程序出错。


内容的提问来源于stack exchange,提问作者Pol Santha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 14:44:55