1. 指针基础
指针是存储内存地址的变量。
int var = 10; // 整型变量
int* ptr = &var; // ptr 存储 var 的地址
&取地址运算符,*声明指针/解引用。
2. 声明与初始化
int* p1; // 指向 int 的指针
double* p2; // 指向 double 的指针
int* p3 = nullptr; // 空指针(C++11)
3. 指针操作
int value = 5;
int* ptr = &value;
cout << ptr; // 输出地址(如 0x7ffdf2c3)
cout << *ptr; // 输出值:5(解引用)
*ptr = 10; // 通过指针修改值
cout << value; // 输出:10
4. 指针算术
仅对数组有效:
int arr[3] = {10, 20, 30};
int* p = arr; // 指向 arr[0]
cout << *p; // 10
p++; // 移动至下一个元素
cout << *p; // 20
5. 动态内存
int* p = new int; // 动态分配
*p = 42;
delete p; // 必须释放内存
p = nullptr; // 避免悬垂指针
// 动态数组
int* arr = new int[5];
delete[] arr;
6. 指针与常量
const int* p1; // 指向常量(值不可改)
int* const p2; // 常量指针(指向不可改)
const int* const p3; // 指向常量的常量指针
7. 智能指针(现代 C++)
#include <memory>
std::unique_ptr<int> p1(new int(5)); // 独占所有权
auto p2 = std::make_unique<int>(10); // C++14 推荐
std::shared_ptr<int> p3 = std::make_shared<int>(20); // 共享所有权
8. 常见错误
-
悬垂指针:指向已释放内存
-
内存泄漏 :未释放
new分配的内存 -
空指针解引用
-
数组越界访问
最佳实践
-
优先使用智能指针而非裸指针
-
及时将指针置为
nullptr -
明确指针所有权(谁负责释放)
-
对数组使用标准容器(
vector、array)
指针是 C++ 底层编程的核心,正确使用可提升效率,错误使用会导致严重问题。现代 C++ 建议通过智能指针和容器自动管理内存。