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

C语言中printf何时需使用&符号?代码不用&报错求解

关于printf中&符号的疑惑解答

嘿,你说得完全没错——在C语言里用printf()的时候,绝大多数情况确实不需要加&符号!毕竟printf是用来输出数据的,它要的是数据本身的值(或者字符串的起始地址),这和需要通过地址修改变量的scanf()完全不一样。

那为什么你的display函数里不加&就报错呢?结合你贴的代码片段,我们来捋清楚:

你定义了一个二维字符数组char name[max][max],用来存患者名字(每个名字都是一个字符串)。假设你的display是想挨个输出这些名字,正确的写法应该是这样:

void display(void) {
    if (front == -1) {
        printf("Queue is empty\n");
        return;
    }
    for (int i = front; i <= rear; i++) {
        printf("Patient: %s\n", name[i]);
    }
}

这里name[i]是二维数组的第i行,它会自动退化成指向该行第一个字符的指针,刚好符合%s格式符的要求(%s需要接收字符串的首地址),这时候根本不需要加&。

那你遇到报错,大概率是这两种情况之一:

  • 格式符和参数不匹配:比如你想用%c输出单个字符,但却传了name[i](这是个指针,不是char类型的值);或者反过来,用%s却传了单个字符name[i][j],这都会让编译器报错。
  • 搞混了printf和scanf的用法:比如你不小心在display里写了printf("%s", &name[i]);——其实name[i]本身已经是地址了,再加&就变成了“指向指针的指针”,和%s要求的char*类型不匹配,反而会出错。

举两个会报错的错误例子:

// 错误:用%s输出单个char值,类型不匹配
printf("%s", name[i][0]); 
// 错误:给%s传了指向数组的指针,不是字符串指针
printf("%s", &name[i]); 

最后再总结下关键点:

  • 用printf("%s", ...)时,直接传字符串首地址(比如一维数组名、二维数组的某一行)就行,不用加&;
  • 用printf("%c", ...)时,直接传char类型的值(比如name[i][j]),也不用加&;
  • 只有scanf需要通过地址修改变量时,才需要加&(不过注意,字符串数组本身就是地址,所以scanf("%s", name[i]);也不用加&)。

你可以去检查下你的display函数代码,应该就是格式符和参数类型不匹配的问题~

内容的提问来源于stack exchange,提问作者Kalana Mihiranga

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 12:10:14