Menu
CoddyTech

经典示例:交换

本课属于 Coddy C 学习旅程的“逻辑与流程”单元。第 28 课,共 63 课。

交换函数是 C 编程中最著名的示例之一,它展示了为什么指针必不可少。目标很简单:编写一个函数,交换两个变量的值。然而,这项看似简单的任务揭示了值传递的一个根本限制。

想一想,如果你尝试使用普通的值传递来交换两个变量,会发生什么:

void badSwap(int a, int b) {
    int temp = a;
    a = b;
    b = temp;
    // 这只交换了副本,没有交换原来的变量!
}

这种方法会失败,因为函数接收到的只是值的副本。调用函数中的原始变量保持不变。

答案需要改为传递变量的指针:

void swap(int *a, int *b) {
    int temp = *a;  // 保存地址 a 中的值
    *a = *b;        // 将地址 b 中的值存入地址 a
    *b = temp;      // 将保存的值存入地址 b
}

通过传递变量的地址并使用解引用运算符,函数可以直接修改原变量的值。这让交换函数完美地展示了何时以及为何需要使用指针来完成仅靠值传递无法处理的任务。

challenge icon

挑战

简单

编写一个 C 程序,使用指针实现并演示经典的交换函数。你的程序应当:

  1. 创建一个名为 swap 的函数,该函数接受两个指向整数的指针作为参数
  2. 在 swap 函数中,使用一个临时变量交换两个指针所指内存地址中的值
  3. 在 main 函数中,从用户输入中读取两个整数
  4. 按以下格式输出原始值:Before swap: a = [value], b = [value]
  5. 调用 swap 函数,并使用取地址运算符传入两个变量的地址
  6. 函数调用后,按以下格式输出交换后的值:After swap: a = [value], b = [value]

输出应展示该函数成功交换了原始变量的值:

Before swap: a = [first_input], b = [second_input]
After swap: a = [second_input], b = [first_input]

这个挑战展示了为什么指针对于交换操作至关重要:函数必须访问原始变量的内存位置,才能永久交换它们的值,而按值传递无法做到这一点。

亲手试试

#include <stdio.h>

// TODO:在这里编写你的交换函数

int main() {
    int a, b;
    
    // 读取输入
    scanf("%d", &a);
    scanf("%d", &b);
    
    // 输出交换前的值
    printf("Before swap: a = %d, b = %d\n", a, b);
    
    // TODO:在这里调用你的交换函数
    
    // 输出交换后的值
    printf("After swap: a = %d, b = %d\n", a, b);
    
    return 0;
}
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

逻辑与流程中的所有课

自己练习: C 在线编译器