C++ 指针深度解析:从入门到实战
C++ 指针深度解析
本教程通过图解与代码实例,全面讲解 C++ 指针的内存模型、声明、解引用、常见陷阱及最佳实践。
在 C++ 中,指针是存储另一变量内存地址的变量。指针实现了直接内存操作、动态内存分配和高效数据处理。
C++ 中的地址
对于变量 var,表达式 &var 返回其内存地址。例如:
示例 1:打印变量地址
#include <iostream>
using namespace std;
int main() {
int var1 = 3;
int var2 = 24;
int var3 = 17;
cout << "Address of var1: " << &var1 << endl;
cout << "Address of var2: " << &var2 << endl;
cout << "Address of var3: " << &var3 << endl;
}
输出
Address of var1: 0x7fff5fbff8ac Address of var2: 0x7fff5fbff8a8 Address of var3: 0x7fff5fbff8a4
地址以十六进制显示。相邻变量地址相差 4 字节,反映了 64 位系统上 int 占 4 字节。
注意: 每次运行程序时,具体地址可能不同。
C++ 指针声明
指针存储地址而非直接值。声明指针:
int *pointVar;
推荐将星号紧贴类型名,强调类型语义:
int* pointVar; // 推荐风格
混合声明时需注意:
int* pointVar, p;
此处 pointVar 是指针,p 是普通 int。星号结合的是变量名而非类型。
提示: 声明指针时 * 不是乘法运算符。
将地址赋给指针
使用取地址运算符 & 绑定指针:
int* pointVar, var;
var = 5;
pointVar = &var; // pointVar 现在保存 var 的地址
通过指针获取值(解引用)
解引用运算符 * 取得指针指向地址处的值:
int* pointVar, var;
var = 5;
pointVar = &var;
cout << *pointVar << endl; // 输出: 5
*pointVar 即为 var 的值(5)。* 称为解引用运算符。
注意: pointVar(指针本身)与 *pointVar(指向的值)是两个完全不同的实体。
示例 2:指针工作机制演示
#include <iostream>
using namespace std;
int main() {
int var = 5;
int* pointVar;
pointVar = &var;
cout << "var = " << var << endl;
cout << "Address of var (&var) = " << &var << endl << endl;
cout << "pointVar = " << pointVar << endl;
cout << "Content of address pointed to by pointVar (*pointVar) = " << *pointVar << endl;
return 0;
}
输出
var = 5 Address of var (&var) = 0x61ff08 pointVar = 0x61ff08 Content of the address pointed to by pointVar (*pointVar) = 5
通过指针修改值
若 pointVar 指向 var,修改 *pointVar 会改变原变量:
int var = 5;
int* pointVar = &var;
*pointVar = 1;
cout << var << endl; // 输出: 1
两者持有相同地址,解引用修改即修改原变量。
示例 3:双向修改演示
#include <iostream>
using namespace std;
int main() {
int var = 5;
int* pointVar = &var;
cout << "var = " << var << endl;
cout << "*pointVar = " << *pointVar << endl << endl;
cout << "Changing value of var to 7:" << endl;
var = 7;
cout << "var = " << var << endl;
cout << "*pointVar = " << *pointVar << endl << endl;
cout << "Changing value of *pointVar to 16:" << endl;
*pointVar = 16;
cout << "var = " << var << endl;
cout << "*pointVar = " << *pointVar << endl;
return 0;
}
输出
var = 5 *pointVar = 5 Changing value of var to 7: var = 7 *pointVar = 7 Changing value of *pointVar to 16: var = 16 *pointVar = 16
指针常见错误与正确用法
int var, *varPoint;
// 错误!varPoint 是地址,var 是值
varPoint = var;
// 错误!&var 是地址,*varPoint 是值
*varPoint = &var;
// 正确!varPoint 和 &var 都是地址
varPoint = &var;
// 正确!*varPoint 和 var 都是值
*varPoint = var;
推荐进阶阅读:
- 如何使用 void 指针实现泛型指针?
- 如何用指针表示数组?
- 如何将指针用于函数参数?
- 如何将指针用于结构体?

C语言