blog.dopana

Back

C++入门系列第五篇。变量存放在内存中的某个地址上。指针和引用是间接访问变量的两种方式——在C++中两者都必不可少。

变量的地址#

每个变量都位于一个内存地址。用 & 获取:

int a = 42;
std::cout << &a << '\n';   // 类似 0x7ffee2b3d5ac
cpp

指针#

指针存储一个地址,其类型表明它指向什么:

int a = 42;
int* p = &a;    // p 指向 a
cpp

* 解引用来读写指针指向的内容:

std::cout << *p << '\n';   // 42
*p = 100;                  // 修改 a
std::cout << a << '\n';    // 100
cpp

空指针#

指针可以不指向任何地址。使用关键字 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';   // 100
cpp

引用不能为空,之后也不能指向其他变量。

传递给函数#

按引用传递可以在不复制的情况下修改调用者的变量:

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++中,函数参数优先使用引用。当”无值”是合法状态或需要重新绑定时,使用指针。

结论#

指针和引用都能间接访问变量。出于安全优先用引用,需要空值或重绑定时用指针。本系列下一篇:类与对象。

参考资料#