二、引用
概念:变量的别名
-
别名:
引用就像是给变量取了一个“绰号”或者“外号”。
它并非新的变量,而是现有变量的另一个名字,它们指向相同的内存地址。
-
声明引用: 使用
&符号声明引用类型。``` int a = 10; int &ra = a; // ra 是 a 的引用 ``` `ra` 现在是变量 `a` 的一个别名,对 `ra` 的任何操作都会直接影响到 `a`。
特点:一旦绑定,终生不变
- 必须初始化:
引用在声明时必须立即被初始化。
且一旦初始化,就永远绑定到最初引用的变量,不能再指向其他变量。
-
不可重新赋值指向: 引用一旦初始化,其指向的内存地址就不可改变。赋值操作会改变引用所指向变量的值,而不是改变引用的指向。
int a = 10; int b = 20; int &ra = a; // ra 引用 a ra = b; // 相当于 a = b; ra 仍然引用 a,只是 a 的值变成了 20
指针和引用的区别:选择合适的工具
| 特性 | 指针 | 引用 |
|---|---|---|
| 定义 | 是一种变量,存储的是内存地址。拥有自己的内存空间。 | 是一个已存在变量的别名,不占用额外的内存空间。 |
| 初始化 | 可以不初始化,可以在任何时候指向不同的变量(修改存储的地址)。 | 必须在声明时初始化,并且一旦初始化,就不能再指向其他变量。 |
| 空值 | 可以为空指针 (nullptr),表示不指向任何有效的内存地址。 | 不存在空引用。引用在声明时必须绑定到一个有效的对象。 |
| 语法 | 使用 * 解引用来访问指向的值,使用 & 取地址。 | 直接使用引用名,就像使用原变量一样。 |
| 效率 | 间接访问,需要通过地址来找到值,效率略低于直接访问。 | 本质上是被引用变量的另一个名字,编译器通常会将其优化为直接访问,效率更高。 |
| 应用场景 | 动态内存分配、函数参数传递(需要修改实参)、实现链表等数据结构。 | 函数参数传递(避免拷贝,直接操作实参)、提高代码可读性、作为函数返回值。 |
| 本质 | 存储内存地址的变量。 | 变量的别名,是对内存地址的封装。 |