1. 问题背景与核心需求
这道题目来自《算法笔记》的2.7章节,要求实现C语言中指针的基础操作。具体来说,题目10.1考察的是通过指针交换两个整型变量的值。这看似简单的操作,却是理解指针机制的重要敲门砖。
在C语言中,指针直接操作内存地址的特性,使其成为区别于其他高级语言的标志性特征。这道题表面是考察变量交换,实则是检验对"地址传递"和"值传递"本质区别的理解。很多初学者在函数参数传递时容易混淆这两者,导致无法正确修改实参的值。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 指针交换的原理剖析
2.1 值传递的局限性
先看一个典型错误实现:
c复制void swap(int a, int b) {
int temp = a;
a = b;
b = temp;
}
这种写法的问题在于:
- 参数是值传递,函数内操作的是实参的副本
- 函数栈帧销毁后,原变量的值并未改变
- 整个过程实际只是在操作局部变量
2.2 指针解决方案
正确做法是传递变量的地址:
c复制void swap(int *p1, int *p2) {
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
关键点解析:
- 参数类型为int*(整型指针)
- *操作符用于解引用,访问指针指向的内存
- 直接修改了原内存地址处的值
内存变化示意图:
code复制调用前:
a(0x1000): 5 b(0x1004): 3
调用时:
p1->0x1000 p2->0x1004
操作后:
a(0x1000): 3 b(0x1004): 5
3. 完整实现与边界处理
3.1 基础实现代码
c复制#include <stdio.h>
void swap(int *p1, int *p2) {
int temp = *p1;
*p1 = *p2;
*p2 = temp;
}
int main() {
int a, b;
scanf("%d%d", &a, &b);
swap(&a, &b);
printf("%d %d", a, b);
return 0;
}
