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

为何两个C语言指针函数执行后输出结果存在差异?

两段指针代码输出不同的原因分析

第一段代码及输出

#include <stdio.h>

void change_ptr(const char *a){
  const char **b = &a;
  *b = "bad";
}

int main(){
  const char *a = "good";
  change_ptr(a);
  printf("%s",a);
  return 0;
}

输出结果:good

第二段代码及输出

#include <stdio.h>

void change_ptr(const char **a){
  *a = "bad";
}

int main(){
  const char *a = "good";
  change_ptr(&a);
  printf("%s",a);
  return 0;
}

输出结果:bad


核心原因解析

两者的本质差异在于函数参数传递方式和指针操作的对象:

  • 第一段代码的问题:
    C语言函数参数默认是值传递,调用change_ptr(a)时,会把main里指针a的内容(即"good"的地址)复制一份,作为函数内部的局部参数a。函数里const char **b = &a;取的是这个局部副本指针的地址,后续*b = "bad"修改的只是这个副本的指向,和main里的原指针没有任何关联。函数执行完毕后,局部副本被销毁,main里的原指针仍指向"good",所以输出good。

  • 第二段代码的正确逻辑:
    函数参数定义为const char **a,调用时传入的是main里原指针a的地址(&a)。此时函数里的*a = "bad",是通过指针的指针直接修改了main中原指针a的指向,让它转而指向"bad"。函数结束后,原指针的修改会保留,因此输出bad。

简单总结:第一段改的是参数副本的指针,第二段改的是原变量的指针。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 19:07:03