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

为什么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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 15:33:21