7.1 指针概念
每个变量都会在内存中占用一块空间,每块空间都有一个地址(address),通常用十六进制表示,例如 0x0060FEFC。指针(pointer)就是专门用来保存地址的变量。
取地址与声明指针
& 是取地址运算符,可以得到一个变量的地址;* 用来声明指针。C++ 输出流可以直接输出地址。
cpp
int data = 3;
int *p = &data; // p 保存 data 的地址
std::cout << data << std::endl; // 3
std::cout << &data << std::endl; // data 的地址
std::cout << p << std::endl; // 与 &data 相同int *p 读作“p 是一个指向 int 的指针”。p 里存的是地址,&data 就是 data 的地址。
解引用
指针保存了另一个变量的地址,于是可以“顺着地址”访问那个变量。在指针前加 * 叫解引用(dereference),既能读出值,也能写回值。
cpp
std::cout << *p << std::endl; // 解引用读出:3
*p = 5; // 通过指针修改 data
std::cout << data << std::endl; // 5*p = 5 并没有改变 p(它仍然指向 data),而是把 data 的值改成了 5。
正在加载交互实验...
正在加载概念检查...
正在加载本节练习...
空指针与野指针
如果声明指针时不初始化,它会指向一个不确定的地址,这种指针叫野指针(wild pointer)。解引用野指针是未定义行为,常常导致程序崩溃。
当指针暂时没有有效目标时,应当把它设为空指针 nullptr,并在解引用前检查:
cpp
int *q = nullptr;
if (q != nullptr) {
std::cout << *q << std::endl; // 只有非空时才解引用
}先让指针指向有效内存,再使用 *,是使用指针最基本的安全习惯。
正在加载本节练习...