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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:14:03