C语言传递指针参数交换字符串指针为何未生效?
C语言指针参数交换不生效的原因
核心误区
你对值传递的理解存在偏差:C语言所有函数参数都是值传递,不管参数是普通变量还是指针变量,函数接收的都是实参的独立副本,对形参的所有修改都只会作用在副本上,不会回写到原实参。
你的代码问题分析
你在fun1中交换的只是str1、str2的副本s1、s2的存储值,完全不会影响main函数里的原指针:
- 调用
fun1(str1, str2)时,只是把str1存储的地址1000、str2存储的地址2000拷贝给了形参s1、s2 s1、s2是fun1的局部变量,和main里的str1、str2是完全独立的内存空间,交换两者的存储值不会对原实参产生任何影响- 函数执行结束后局部变量销毁,
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
相关产品推荐
相关产品推荐

