先看反例:不用t会怎么样?
假设我们想交换a=1和b=2,如果直接这么写:
// 错误示范:没有临时变量t *a = *b; // 把b的值(2)赋给a → 现在a=2,b=2 *b = *a; // 再把a的值(已经变成2了)赋给b → 最终a=2,b=2结果是两个数都变成了 2,原来的 a 的值(1)彻底丢了,根本没完成交换!
再看正确逻辑:t 的作用是 “暂存”
t就是一个临时的 “小仓库”,专门用来保存被覆盖前的值,避免丢失:
int t = *a; // 先把a的原始值(1)存到t里 → t=1,a=1,b=2 *a = *b; // 把b的值(2)赋给a → a=2,b=2,t=1(关键:t还存着1) *b = t; // 把t里的原始a值(1)赋给b → a=2,b=1,完成交换用生活例子理解
你可以把这个过程想象成:
- 你有两个杯子:A 杯装可乐,B 杯装雪碧;
- 你想把 A 杯换成雪碧,B 杯换成可乐;
- 如果直接把 B 杯的雪碧倒进 A 杯 → A 杯的可乐就没了,之后再倒也只能倒雪碧;
- 所以你需要一个空杯子
t:先把 A 杯的可乐倒进t,再把 B 杯的雪碧倒进 A 杯,最后把t里的可乐倒进 B 杯 → 完美交换。
回到代码里的 swap 函数
void swap(int *a, int *b) { int t = *a; // t = 左指针位置的原始值(比如0) *a = *b, *b = t; // 把右指针的非0值赋给左指针,再把t里的0赋给右指针 }比如之前例子里交换nums[0]=0和nums[1]=1:
t = nums[0]→t=0;nums[0] = nums[1]→nums[0]=1;nums[1] = t→nums[1]=0;最终实现[0,1]→[1,0],这一步没有t就做不到。
总结
t是临时变量,核心作用是暂存被覆盖前的原始值,避免交换时数据丢失;- 直接互相赋值会导致其中一个值被覆盖,无法完成真正的交换;
- 所有交换两个变量的场景(不管是数字、数组元素),几乎都需要这样的临时变量。