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

C语言传递指针参数交换字符串指针为何未生效?

C语言指针参数交换不生效的原因

核心误区

你对值传递的理解存在偏差:C语言所有函数参数都是值传递,不管参数是普通变量还是指针变量,函数接收的都是实参的独立副本,对形参的所有修改都只会作用在副本上,不会回写到原实参。

你的代码问题分析

你在fun1中交换的只是str1、str2的副本s1、s2的存储值,完全不会影响main函数里的原指针:

  1. 调用fun1(str1, str2)时,只是把str1存储的地址1000、str2存储的地址2000拷贝给了形参s1、s2
  2. s1、s2是fun1的局部变量,和main里的str1、str2是完全独立的内存空间,交换两者的存储值不会对原实参产生任何影响
  3. 函数执行结束后局部变量销毁,str1、str2的值完全没有变化,因此输出还是Hello there!

正确的交换实现

如果要在函数内交换两个指针变量本身的值,需要传递指针的地址(即二级指针),通过解引用访问到原指针的内存空间做修改:

void fun1(char **s1, char **s2) {
     char *temp;
     temp = *s1;
     *s1 = *s2;
     *s2 = temp;
}

int main () {
     char *str1 = "Hello", *str2 = "there!";
     // 传入两个指针变量本身的地址
     fun1(&str1, &str2);
     printf("%s %s", str1, str2);
     return 0;
}

上述代码运行后就会输出你预期的there! Hello。

逻辑类比

这个逻辑和普通变量交换是完全一致的:

  • 要交换两个int类型变量的值,需要传int*作为参数,在函数内解引用修改
  • 要交换两个char*类型变量的值,自然需要传char**作为参数,在函数内解引用修改

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.07 18:54:00