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

为何在exchange函数内调用swap无法交换a和b,直接调用却可行?

问题原因分析

核心问题出在函数参数的副本传递机制以及swap函数的作用对象上:

1. 两种场景的本质差异

假设你的目标是交换两个char变量x和y的实际值:

  • operation2:直接调用swap(&x, &y)能生效,说明你的swap函数逻辑是通过指针修改目标变量的内存内容,比如标准实现:

    void swap(char *a, char *b) {
        char temp = *a;
        *a = *b;
        *b = temp;
    }
    

    调用时传入x和y的地址,swap直接操作*a和*b(也就是x和y的内存),自然能完成交换。

  • operation1:自定义的exchange函数接收char *a和char *b作为参数,内部调用swap(a,b)却无法生效,原因在于:
    当你调用exchange(&x, &y)时,a和b是传入指针的局部副本——它们是exchange函数内部的独立变量,值等于&x和&y,但和主函数里的原始指针(或x、y的地址)没有关联。
    如果你的swap函数是用来交换指针变量本身的值(而非指针指向的内容),比如错误实现:

    void swap(char *a, char *b) {
        char *temp = a;
        a = b;
        b = temp;
    }
    

    那swap(a,b)只会交换exchange内部a和b的指向,完全不会影响主函数里的x和y,所以交换无效。

2. 关键结论

  • 函数参数传递时,指针本身也是按值传递的,函数内部拿到的是指针的副本,修改副本不会影响外部的原始指针。
  • 要实现目标变量的交换,必须确保操作的是指针指向的内存内容,而非指针变量本身。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 02:25:16