C语言字符串交换疑问:为何指针传参函数内显示交换但外部未生效?
为什么你的swap函数内部生效但外部没变化?
嘿,这个问题其实是C语言里指针参数传递的经典坑,我来给你掰明白:
核心原因:C语言的参数是「值传递」,指针也不例外
你写的swap函数里,char *first和char *last是函数的形参——它们只是外部传入的指针的「副本」。当你在函数里交换这两个指针的指向时,你只是修改了这两个副本的内容,完全碰不到外部原来的那两个指针变量。
举个例子,假设你函数里的代码是这样的:
void swap(char * first, char * last) { char *temp = first; first = last; last = temp; // 这里打印的是函数内部的副本指针指向的内容,看起来交换了 printf("Inside swap: first=%s, last=%s\n", first, last); }
外部调用的时候:
int main() { char *first_name = "Joe"; char *last_name = "Bloggs"; swap(first_name, last_name); // 这里打印的还是原指针的指向,根本没变化 printf("Outside swap: first=%s, last=%s\n", first_name, last_name); return 0; }
函数内部的first和last只是first_name和last_name的复制品,你交换复制品,原变量当然纹丝不动。
怎么解决?用二级指针(指针的指针)
如果想让函数能修改外部的指针变量,你需要传递指针的地址,也就是用char**作为参数。这样函数里就能通过解引用操作,直接修改外部指针的指向了。
正确的swap函数应该是这样:
#include <stdio.h> void swap(char ** first, char ** last) { // 先保存第一个指针指向的内容 char *temp = *first; // 修改外部第一个指针的指向,让它指向第二个指针的内容 *first = *last; // 修改外部第二个指针的指向,让它指向原来第一个指针的内容 *last = temp; printf("Inside swap: first=%s, last=%s\n", *first, *last); } int main() { char *first_name = "Joe"; char *last_name = "Bloggs"; // 传递指针的地址 swap(&first_name, &last_name); printf("Outside swap: first=%s, last=%s\n", first_name, last_name); return 0; }
这样运行后,外部的first_name和last_name就真正交换指向了。
额外提醒:字符串字面量的注意点
另外要注意,"Joe"和"Bloggs"是字符串字面量,它们存在只读内存区域,如果你试图修改它们的内容(比如用strcpy交换内容),会导致未定义行为。所以用交换指针指向的方式是正确的,前提是你的指针指向的是可修改的内存或者字符串字面量(只是交换指向,不修改内容)。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

