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
相关产品推荐
相关产品推荐

