C++指针正确使用与操作(精简完整版)
一、指针基础定义
指针是存储变量内存地址 的变量,格式:类型* 指针名
cpp
int a = 10;
int* p = &a; // &取地址,p存放a的地址
*p = 20; // *解引用,修改地址对应的值
二、核心基础操作
- & 取地址:获取变量内存地址
- *** 解引用**:通过地址访问对应数据
- 赋值:同类型指针才能互相赋值
三、各类指针规范用法
1. 普通变量指针
cpp
int num = 5;
int* ptr = #
cout << *ptr; // 输出5
2. 数组指针
数组名本质首元素地址,无需加&
cpp
int arr[3] = {1,2,3};
int* p = arr;
*(p+1) = 99; // 修改第二个元素
3. 函数指针
存储函数地址,用于回调
cpp
void test(){}
void (*fp)() = test;
fp(); // 调用函数
4. const指针(三种,极易踩坑)
const int* p:指针可改,指向的值不可改int* const p:指针本身地址固定,值可改const int* const p:地址、值全都不能修改
5. 二级指针 int** p
存放一级指针的地址,多用于动态数组、函数修改外部指针
四、动态内存 new / delete(重点规范)
单个变量
cpp
int* p = new int(100); // 开辟堆内存
delete p; // 释放内存
p = nullptr; // 置空,防止野指针
数组
cpp
int* arr = new int[5];
delete[] arr; // 数组必须加[]释放
arr = nullptr;
规则:
new必须配对delete,否则内存泄漏- 释放后立刻赋值
nullptr,杜绝野指针
五、安全使用准则(避坑核心)
-
禁止野指针
未初始化、已释放的指针都是野指针,访问直接崩溃。
定义时直接初始化:
int* p = nullptr; -
不要返回局部变量地址
局部变量存栈,函数结束自动销毁,返回地址会失效。
cppint* badFunc(){ int x=1; return &x; // 错误! } -
指针越界禁止访问
数组指针
p+n不能超出数组长度,会篡改其他内存。 -
不同类型指针禁止随意强转
类型不匹配会造成取值错乱。
-
空指针判断
使用前先判断:
if(p != nullptr),避免空指针崩溃。 -
堆内存谁开辟谁释放
new和delete成对,不重复释放同一块内存。
六、C++现代替代方案(优先推荐)
尽量少用裸指针,用智能指针自动管理内存,无需手动delete:
unique_ptr:独占资源,性能高shared_ptr:共享资源,计数回收
cpp
#include <memory>
unique_ptr<int> p = make_unique<int>(10);
// 自动释放,不用delete
配套标题可选
- C++指针完整使用规范与避坑指南
- 一文吃透C++指针操作、内存管理
- C++裸指针安全使用全套教程
- C++指针从基础到智能指针实战