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

C语言传递字符指针:为何程序输出未如预期为"hai"?

为什么你的C语言程序输出不是"hai"?

咱们先拆解你的代码问题核心:指针在C语言里是按值传递的,这就是为什么你修改函数里的s后,主函数的t完全没变化。

问题详细分析

你看,在main函数里,char *t = "welcome";让t指向了字符串常量"welcome"的内存地址。当你调用first(t)时,C语言会把t的值(也就是那个内存地址)复制一份给函数first的形参s。这时候,s和t虽然指向同一个地址,但它们是两个完全独立的变量——s只是t的一个"副本"。

在first函数里,你执行了s = "hai";,这只是把s这个局部变量的指向改成了"hai"的地址,但主函数里的t根本不知道这件事!因为s是函数内部的局部变量,函数执行完毕后就会被销毁,它的修改完全不会影响到主函数里的t。所以最后printf("%s", t);还是会输出t原本指向的"welcome"。

两种解决办法

如果你想让主函数的t指向"hai",可以用下面两种方式:

方法1:传递指针的指针(二级指针)

通过传递t的地址,让函数能直接修改t本身的指向:

#include<stdio.h>
#include<conio.h>
void first(char**);
void first(char **s) {
    printf("%u", *s);
    *s = "hai"; // 解引用二级指针,修改主函数中t的指向
}
int main() {
    clrscr();
    char *t = "welcome";
    printf("%u", t);
    first(&t); // 传递t的地址
    printf("%s", t); // 现在会输出"hai"
    getch();
    return 0;
}

方法2:使用字符数组(修改字符串内容)

如果你想修改字符串的内容而不是指针指向,注意不能直接修改字符串常量(它们存在只读内存),所以要改用字符数组:

#include<stdio.h>
#include<conio.h>
#include<string.h>
void first(char*);
void first(char *s) {
    printf("%u", s);
    strcpy(s, "hai"); // 把"hai"复制到s指向的可修改内存
}
int main() {
    clrscr();
    char t[] = "welcome"; // 字符数组,内存可修改
    printf("%u", t);
    first(t);
    printf("%s", t); // 输出"hai"
    getch();
    return 0;
}

关键知识点总结

  • C语言里所有参数都是值传递,包括指针。形参是实参的副本,修改形参不会影响实参本身。
  • 字符串常量(比如"welcome")存储在只读数据段,不能直接修改其内容,所以如果要修改字符串内容,必须用字符数组。
  • 要修改主函数中指针的指向,需要传递指针的指针(二级指针),这样函数才能通过解引用操作修改原指针变量的值。

内容的提问来源于stack exchange,提问作者Prasath Shanmugakani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:53:26