Z
ZHANK
指针与内存

指针与 nullptr

指针基础、& 和 *、nullptr(C++11)、void* vs typed pointer

指针与 nullptr

C++ 保留了 C 的全部指针能力,同时引入 nullptr(类型安全的空指针)来代替 NULL

学完本章你将: 掌握指针基础、& 和 *、nullptr 为什么比 NULL 好。


指针基础

cpp
#include <iostream>

int main() {
    int x = 42;
    int *p = &x;          // p 指向 x

    std::cout << p << "\n";   // x 的地址
    std::cout << *p << "\n";  // 42(解引用)

    *p = 100;
    std::cout << x << "\n";   // 100

    return 0;
}

nullptr —— 类型安全的空指针

cpp
// NULL 的问题
void f(int x)    { std::cout << "int\n"; }
void f(void *p)  { std::cout << "pointer\n"; }

f(0);        // 调用 f(int)——0 是 int
f(NULL);     // 调用 f(int) 还是 f(void*)?歧义!
f(nullptr);  // 明确调用 f(void*)——nullptr 只能赋给指针

💡 C++11 起,永远用 nullptr 而不是 NULL0nullptr 有类型 std::nullptr_t,不会与整数混淆。


void* 与 typed pointer

cpp
void *vp = &x;         // 可指向任何类型
// *vp = 100;          // ❌ 不能解引用 void*
int *ip = static_cast<int *>(vp);  // 先转换
*ip = 100;             // ✅

// C++ 推荐用模板而不是 void* 做泛型