)
指针是 C、C 语言的核心精髓而裸指针Raw Pointer就是最原始、最基础的普通指针即直接使用*定义、无智能指针包装、无自动内存管理的原生指针。相比于 C11 之后的 shared_ptr、unique_ptr 等智能指针裸指针性能极致、开销几乎为零但需要开发者手动管理内存、严格规避内存风险。无论是底层开发、算法刷题、嵌入式编程、操作系统、框架源码阅读裸指针都是必须掌握的基础能力。本文将从零讲解裸指针的概念、语法、运算、常见用法、经典场景以及高频避坑点零基础也能快速上手。一、什么是裸指针1. 核心定义裸指针泛指 C/C 原生的普通指针直接存储变量的内存地址没有任何封装、没有自动回收机制完全由开发者手动控制内存的申请与释放。常见裸指针形式int*、char*、double*、自定义结构体指针等。与智能指针的核心区别裸指针手动 new/delete无引用计数不自动释放性能高风险高智能指针自动内存管理安全性高有少量性能开销2. 指针与地址的通俗理解内存地址电脑内存中每一块空间的唯一编号类似房间门牌号指针变量专门用来存放「门牌号内存地址」的变量解引用通过门牌号找到对应的房间并操作里面的数据二、裸指针基础语法定义与初始化1. 指针定义规则语法格式数据类型 * 指针变量名int* p; // 定义一个int类型裸指针 char* str; // char类型裸指针 double* dp; // double类型裸指针注意*属于变量不属于类型int* p和int *p语法完全等价。2. 取地址与解引用两大核心操作 取地址符获取变量的内存地址* 解引用符通过指针地址访问对应内存中的数据#include iostream using namespace std; int main() { int a 100; int* p a; // 指针p保存变量a的地址 cout a的地址 a endl; cout 指针p存储的地址 p endl; cout 指针解引用的值 *p endl; *p 200; // 通过指针修改原变量的值 cout 修改后a的值 a endl; return 0; }核心结论指针修改解引用的值会直接修改原变量因为二者指向同一块内存空间。3. 空指针初始化规范写法未初始化的裸指针会指向随机脏内存极易导致程序崩溃定义指针必须初始化// 规范1C11及以上推荐 int* p nullptr; // 规范2C语言常用 int* p NULL; // 禁止未初始化野指针 int* p;nullptr是空指针常量类型安全是现代 C 首选NULL 本质是宏 0存在类型隐患。三、裸指针的常见分类1. 普通变量指针指向普通栈区变量无需手动释放内存变量生命周期结束自动失效。int num 666; int* p num;2. 动态内存指针堆区指针通过new在堆区开辟内存必须手动 delete 释放否则造成内存泄漏。// 单个变量堆内存 int* p new int; *p 10; delete p; // 释放内存 p nullptr; // 置空防止野指针 // 数组堆内存 int* arr new int[5]; arr[0] 1; delete[] arr; // 数组必须加[]释放 arr nullptr;3. 数组指针数组名本质是数组首元素地址可以直接赋值给裸指针。int nums[] {10, 20, 30}; int* p nums; cout p[0] endl; // 10 cout *p endl; // 104. 结构体指针常用于自定义数据结构通过-访问成员变量。struct Student { int id; char name[20]; }; Student s {1001, Tom}; Student* p s; p-id 1002; // 指针访问成员用 - cout p-id endl;四、裸指针算术运算核心考点裸指针支持加减运算运算单位为指向类型的字节大小而非单纯1。例如int*指针 1地址实际偏移 4 字节char*指针 1地址偏移 1 字节。int arr[] {1,2,3,4,5}; int* p arr; cout *p endl; // 1 cout *(p 1) endl; // 2 cout *(p 2) endl; // 3 // 指针遍历数组 for(int i 0; i 5; i){ cout *(p i) ; }指针加减常用来遍历数组、遍历连续内存块是底层代码高频写法。五、指针作为函数参数传地址普通变量传参是值传递函数内修改不影响外部指针传参是地址传递可以直接修改实参原始数据也是交换变量的经典写法。void swap(int* a, int* b) { int temp *a; *a *b; *b temp; } int main() { int x 10, y 20; swap(x, y); cout x y endl; // 20 10 return 0; }六、裸指针核心优缺点1. 优点性能极致无任何封装开销内存占用极小运行速度最快灵活性高直接操作内存适配底层开发、内核、嵌入式、算法高性能场景通用性强C/C 底层库、第三方库、硬件接口全部兼容裸指针2. 缺点手动管理内存new 必须配对 delete遗漏会造成内存泄漏极易出现野指针未初始化、已释放继续使用、越界访问都会崩溃内存重复释放同一块内存多次 delete程序直接宕机无自动容错越界、空指针访问不会主动报错问题隐蔽难排查七、裸指针高频致命坑与解决方案1. 野指针最高频错误指针未初始化指向随机未知内存触发未知崩溃。// 错误 int* p; *p 100; // 野指针崩溃 // 正确 int* p nullptr; if(p ! nullptr){ // 使用前判空 *p 100; }2. 内存泄漏new 开辟堆内存函数结束或程序退出未 delete内存无法回收。void test() { int* p new int[100]; // 未释放内存泄漏 } // 规范写法成对使用 new/delete int* p new int; delete p; p nullptr;3. 重复释放内存同一块内存多次 delete破坏内存堆结构程序崩溃。int* p new int; delete p; delete p; // 错误重复释放 // 解决释放后立即置空空指针delete安全 delete p; p nullptr; delete p; // 不会报错4. 指针越界访问裸指针不做边界检查越界读写会篡改其他内存引发诡异 bug。八、裸指针与智能指针使用场景选择✅ 优先使用裸指针的场景高性能算法、极限性能优化场景嵌入式、操作系统、驱动等底层开发大型框架底层、库函数封装短期指针、无需复杂内存管理的临时指针✅ 优先使用智能指针的场景业务层开发、长生命周期堆对象容易遗忘释放内存、复杂对象管理需要自动回收、避免内存泄漏的场景九、裸指针开发最佳实践指针必初始化定义裸指针默认赋值 nullptr使用前必判空避免空指针解引用崩溃new/delete 成对堆内存申请后必须释放释放后立即置空杜绝重复释放、野指针问题尽量缩短指针生命周期用完即释放减少风险数组释放必须加 []数组裸指针使用 delete[]十、全文总结裸指针是 C/C 最基础、最高效、也最危险的内存操作工具核心本质是存储内存地址的变量通过取地址、解引用、指针运算完成对内存的直接操作。熟练掌握裸指针需要记住三大核心地址存储数据、解引用操作数据、手动管理堆内存。日常开发中底层高性能场景用裸指针、业务安全场景用智能指针严格遵守内存管理规范即可彻底规避野指针、内存泄漏、重复释放等经典问题。来源www.ymvpzi.cn来源m.ymvpzi.cn来源163.ymvpzi.cn来源618.ymvpzi.cn来源a.ymvpzi.cn来源1.ymvpzi.cn来源we.ymvpzi.cn来源wap.ymvpzi.cn来源app.ymvpzi.cn来源dnf.ymvpzi.cn来源lpl.ymvpzi.cn来源h5.ymvpzi.cn来源bbs.ymvpzi.cn来源b.ymvpzi.cn来源c.ymvpzi.cn来源web.ymvpzi.cn来源cs.ymvpzi.cn来源g2.ymvpzi.cn来源t1.ymvpzi.cn来源i7.ymvpzi.cn