📌 前言:为什么要学指针?
指针是C++的灵魂!它能让你:
-
直接操作内存(像黑客一样掌控数据)
-
实现高效的数据传递(避免大对象复制)
-
构建复杂数据结构(链表/树/图)
-
理解计算机底层工作原理
即使有智能指针,掌握原始指针仍是进阶必备技能!
🚀 一、指针基础概念
什么是指针
变量:存储值的盒子
指针:记录盒子位置的地图坐标
int num = 42; // 盒子里的值
int* p = # // p存储num的地址
指针三要素
声明符号 *
double* dp; // 指向double的指针
取地址符 &
cout << "地址:" << # // 输出0x7ffeeb4b4a9c类似值
解引用符 *
*p = 100; // 通过指针修改值
🔍 二、指针操作全解析
int arr[5] = {1,2,3,4,5};
int* ptr = arr; // 指向数组首元素
操作 | 示例 | 作用 |
---|---|---|
基本访问 | *ptr | 获取指向的值 |
指针算术 | ptr++ | 移动到下一个元素(+sizeof(int)) |
数组索引 | ptr[2] | 等同*(ptr+2) |
比较运算 | ptr1 == ptr2 | 判断是否指向同一地址 |
💣 三、指针八大陷阱
野指针
int* danger; // 未初始化
*danger = 42; // 随机写入→程序崩溃!
内存泄漏
int* p = new int[100];
// 忘记delete[] p → 内存永远无法回收!
悬空指针
int* p = new int(10);
delete p; // 释放内存...
cout << *p; // 访问已释放内存→未定义行为!
越界访问
int arr[3] = {1,2,3};
int* p = arr;
cout << p[3]; // 越界访问→可能读取垃圾值
🔧 四、指针高级技巧
多级指针
int num = 10;
int* p = #
int** pp = &p; // 指向指针的指针
cout << **pp; // 输出10
函数指针
void greet() { cout << "Hello!"; }
void (*funcPtr)() = greet; // 函数指针
funcPtr(); // 调用函数
const修饰符
const int* p1; // 指向常量(值不可改)
int* const p2; // 常量指针(地址不可改)
const int* const p3; // 双常量
🎯 五、指针使用黄金法则
初始化原则:声明时立即初始化
空指针检查:操作前先判空
if (ptr != nullptr) { /* 安全操作 */ }
内存管理口诀:
new 和 delete 成对出现
new[] 和 delete[] 永远搭配
因为new的是堆内存分配,而普通的指针会跟随生命周期自动释放。
优先选择栈内存:
int localVar; // 自动管理 ← 推荐
int* heapVar = new int; // 需手动管理
🌈 结语:
指针就像一把双刃剑——用得好能写出高效优雅的代码,用不好会引发灾难性后果。掌握这些知识后,你可以:
✅ 理解C++底层运作机制
✅ 高效操作内存和数据
✅ 为学习智能指针打下基础