C++入门系列第五篇。变量存放在内存中的某个地址上。指针和引用是间接访问变量的两种方式——在C++中两者都必不可少。
变量的地址#
每个变量都位于一个内存地址。用 & 获取:
int a = 42;
std::cout << &a << '\n'; // 类似 0x7ffee2b3d5accpp指针#
指针存储一个地址,其类型表明它指向什么:
int a = 42;
int* p = &a; // p 指向 acpp用 * 解引用来读写指针指向的内容:
std::cout << *p << '\n'; // 42
*p = 100; // 修改 a
std::cout << a << '\n'; // 100cpp空指针#
指针可以不指向任何地址。使用关键字 nullptr,解引用前务必检查:
int* p = nullptr;
if (p != nullptr) {
std::cout << *p << '\n';
}cpp解引用 nullptr 会崩溃——这就是空指针解引用。
引用#
引用是已有变量的别名。它只能绑定一次,之后不能再重新绑定:
int a = 42;
int& r = a; // r 是 a 的另一个名字
r = 100; // 修改 a
std::cout << a << '\n'; // 100cpp引用不能为空,之后也不能指向其他变量。
传递给函数#
按引用传递可以在不复制的情况下修改调用者的变量:
void increment(int& x) {
++x;
}
int main() {
int a = 5;
increment(a);
std::cout << a << '\n'; // 6
}cpp想避免复制但不修改时,用 const int&:
void describe(const std::string& s) {
std::cout << s.size() << '\n';
}cpp指针与引用的对比#
| 指针 | 引用 | |
|---|---|---|
| 可以为空 | 可以(nullptr) | 不可以 |
| 可以更换指向 | 可以 | 不可以 |
| 需要解引用 | 需要(*) | 隐式 |
| 可以重新赋值 | p = &other | 不可以 |
现代C++中,函数参数优先使用引用。当”无值”是合法状态或需要重新绑定时,使用指针。
结论#
指针和引用都能间接访问变量。出于安全优先用引用,需要空值或重绑定时用指针。本系列下一篇:类与对象。