指针是存储地址的变量,引用是变量的别名。指针可以为空、可修改指向、需解引用访问,占用独立内存;引用必须初始化、不可更改绑定对象、直接使用更安全,常用于避免拷贝和简化函数参数传递。1. 指针保存变量地址,支持动态内存分配、多级指针等操作。2. 引用作为别名不占额外内存,提升效率且更安全。3. 使用上,需灵活指向或允许空时用指针,仅做别名且不变时用引用。

指针和引用是C++里两个非常基础但又容易混淆的概念。它们都跟内存地址打交道,但本质上一个是“操作地址”,另一个更像是“起别名”。理解清楚这一点,很多问题就迎刃而解了。

指针的本质:存储地址的变量
指针是一个变量,它保存的是另一个变量的地址。你可以通过这个地址去访问或修改那个变量的值。

比如:
立即学习“C++免费学习笔记(深入)”;
int a = 10; int* p = &a;
这里的
p是一个指向
int类型的指针,它保存了变量
a的地址。你可以对指针做加减、赋值、解引用等操作。

常见用法包括:
- 动态内存分配(new/delete)
- 函数参数传递时修改原始数据
- 数组遍历、链表、树等数据结构实现
需要注意的地方:
- 指针可以为
nullptr
,表示不指向任何对象 - 指针可以重新赋值,指向不同的变量
- 多级指针(如
int**
)在某些场景下很有用,但也更复杂
引用的本质:变量的别名
引用更像是一个“别名”,它并不真正占用额外的内存空间(编译器通常会把它优化成指针),但它从语法上看起来就像是原变量本身。
例如:
int a = 10; int& ref = a;
这里
ref就是
a的别名,对
ref的修改其实就是对
a的修改。
关键特点包括:
- 引用必须初始化,且不能更改绑定对象
- 引用不会为空,使用起来比指针更安全
- 引用常用于函数参数和返回值,避免拷贝提升效率
举个例子,如果你写一个交换函数:
void swap(int& a, int& b) {
int temp = a;
a = b;
b = temp;
}这样调用的时候就可以直接传变量进去,不用取地址,代码也更清晰。
指针与引用的核心区别
| 特性 | 指针 | 引用 |
|---|---|---|
| 是否可为空 | 可以是 @@######@@ | 不可以为空 |
| 是否能改变指向 | 可以重新赋值 | 初始化后不能改变 |
| 是否需要解引用 | 需要 @@######@@ 来访问 | 直接当作变量使用 |
| 内存占用 | 占用指针大小(通常是4或8字节) | 编译器处理,可能没有额外开销 |
还有一个比较微妙的区别是语义上的:指针强调“我指向某个地方”,引用强调“我就是它”。
使用建议:什么时候用指针?什么时候用引用?
简单来说:
- 如果你需要改变指向的对象,或者允许“空”的情况,那就用指针
- 如果你只是想对一个对象做别名,并且不需要中途换人,那引用更合适
举个例子,在类成员中,如果你希望保存一个外部对象的引用,但后续可能会变,那还是得用指针;而像 STL 容器的
nullptr返回的就是引用,因为它的作用就是直接访问元素,而不是复制一份。
再比如函数参数传递时:
- 基本类型传值就行
- 对象较大时用 const 引用避免拷贝
- 需要修改实参时用引用或指针都可以,引用写法更简洁
基本上就这些。指针和引用看似差不多,其实一个重在操作地址,一个重在建立别名。理解清楚它们的不同,写 C++ 时才会更有底气。
*
operator[]










