为什么C语言中使用单指针作为参数无法修改字符串?
为什么单指针参数无法修改原字符串,双指针却可以?
我理解通过双指针作为函数参数能够修改原字符串,示例代码如下:
#include <stdio.h> #include <stdlib.h> #include <string.h> void display(char** output) { printf("%s\n", *output); *output = "This is another test"; } int main(void) { char* str = "This is a test"; display(&str); printf("After the call: %s\n", str); return 0; }
但我搞不懂为什么用单指针作为参数时,没法修改原字符串:
#include <stdio.h> #include <stdlib.h> #include <string.h> void display(char* output) { printf("%s\n", output); output = "This is another test"; printf("%s\n", output); } int main(void) { char* str = "This is a test"; display(str); printf("After the call: %s\n", str); return 0; }
核心原因:C语言的「传值调用」规则
C语言里所有函数参数都是传值调用——调用函数时,会把实参的一份副本传给形参,形参和实参是完全独立的两个变量,只是初始值相同。
双指针能修改原字符串的逻辑
你传递的是str的地址(&str),形参char** output接收的是这个地址的副本。此时*output就等价于主函数里的str,当你执行*output = "新字符串"时,本质是通过地址找到了原变量str,直接修改了它存储的指针值,所以主函数里的str指向会被改变。
单指针无法修改的原因
这里传递的是str的值(也就是原字符串常量的地址),形参char* output是这个地址的副本。函数里给output赋值新的字符串地址,只是修改了这个副本变量的指向,和主函数里的str没有任何关系。函数执行完毕后,形参output被销毁,原str的指向完全没被触动,所以主函数打印的还是原来的内容。
额外补充:如果只是想修改字符串的内容(不是替换整个指针指向),单指针也能做到,但前提是字符串存储在可修改的内存区域(比如char str[] = "test"这样的字符数组),而不是不可修改的字符串常量。不过这和你问的指针指向修改是两个不同的问题。
内容的提问来源于stack exchange,提问作者Fary
相关产品推荐
相关产品推荐

