承接前文对输入输出和缺省参数的讨论,我们接着看 C++ 中三个容易混淆的基础概念:引用、内联函数和 nullptr。
引用:给变量起个别名
引用不是定义新变量,而是给已有的变量取一个别名,两者共享同一块内存,编译器不会为别名单独分配空间。打个比方,'马铃薯'和'土豆'指的就是同一种东西。声明语法的样子:
类型& 别名 = 变量;
实际操作一下:
int a = 10;
int& num = a; // num 就是 a 的另一个名字
现在 num 的值就是 10。注意,C++ 里这个 & 表示取别名,跟 C 语言里取地址不是一回事——虽然长得一样。
引用有几个必须遵守的规则。定义时必须初始化——你得先有个人,才能起外号。一个变量可以有多个引用,它们的地址完全相同,比如:
int a = 10;
int& num1 = a;
int& word = a;
int& word2 = word;
最后一个例子提醒我们,引用本身也可以被其他别名引用。但另一边,引用一旦初始化就不能再指向别的变量了,试图重新绑定会直接编译报错。这种'从一而终'的设计避免了指针那种随意变向带来的混乱。
传参和返回值:引用的主战场
引用最常见的应用是在函数中替代指针,让代码更干净也更安全。
用引用交换两个值
传统 C 通过指针交换两个数,要在函数里解引用:
void Swap(int* x, int* y) {
int temp = *x;
*x = *y;
*y = temp;
}
用引用改写则直观很多:
void Swap(int& x, int& y) {
int temp = x;
x = y;
y = temp;
}
对比起来,引用传参像是直接操作实参本身,没有 * 和 & 符号的干扰。
修改链表头指针更简单
处理链表插入时,经常要更新头指针。以前用二级指针,写法容易晕:
void PushElemFront(ListNode** pphead, int elem) {
}


