C++基础——引用和指针篇
一、指针(Pointer)
定义:
指针是一个变量,用于存储另一个变量的地址。
基本用法:
#include <iostream>
using namespace std;
int main() {
int a = 10;
int* p = &a; // p 存储 a 的地址
cout << "a 的值: " << a << endl;
cout << "p 指向的值: " << *p << endl; // 通过解引用访问 a 的值
return 0;
}
常见用途:
- 动态内存管理(
new
,delete
) - 传递大对象的地址以减少复制开销
- 实现数据结构(链表、树等)
- 函数指针、回调函数
二、引用(Reference)
定义:
引用是某个变量的别名,必须在定义时初始化,不能更改指向。
基本用法:
#include <iostream>
using namespace std;
int main() {
int a = 10;
int& ref = a; // ref 是 a 的引用
ref = 20; // 相当于修改 a
cout << "a 的值: " << a << endl; // 输出 20
return 0;
}
常见用途:
- 函数参数传递:减少复制,提高效率
- 返回值优化:如操作符重载中常返回引用
- C++ 引用语义:适用于 STL 容器遍历、函数链式调用等
三、引用 vs 指针
特性 | 指针 | 引用 |
---|---|---|
是否可以为 null | 可以 | 不可以(必须绑定合法对象) |
是否可重新赋值 | 可以指向不同对象 | 不能更改绑定对象 |
是否可修改地址 | 可以 | 不可以(底层实现是隐藏的指针) |
语法使用 | 使用 * , & 操作 |
类似变量操作(无需解引用) |
是否有内存开销 | 有,实际占一个地址空间 | 没有额外开销,编译器优化处理 |
四、在函数中的对比用法
使用指针:
void swap(int* a, int* b) {
int tmp = *a;
*a = *b;
*b = tmp;
}
int main() {
int x = 1, y = 2;
swap(&x, &y);
cout << x << " " << y << endl; // 输出 2 1
}
使用引用(C++ 推荐):
void swap(int& a, int& b) {
int tmp = a;
a = b;
b = tmp;
}
int main() {
int x = 1, y = 2;
swap(x, y);
cout << x << " " << y << endl; // 输出 2 1
}
五、与 C 的区别
- 引用是 C++ 特有的,C 语言没有引用概念,只能用指针。
- C 中函数参数修改必须用指针,而 C++ 中可用引用,更安全简洁。
- C++ 引用语义也用于支持高级特性(如智能指针、右值引用、move 语义等)。
六、指针与引用的性能差距
- 指针和引用对应的汇编码完全相同,所以二者的没有任何的性能差异。C++中的引用可以看做是C++对于指针操作的一个“语法糖”,底层实现完全一致。
总结
适用场景 | 推荐使用 |
---|---|
函数需要修改参数 | 使用引用(C++)或指针(C) |
需要 nullptr | 只能使用指针 |
动态内存分配 | 使用指针 |
简洁代码 | 优先使用引用 |