C++指针入门:10分钟掌握核心用法
一、什么是地址?
程序运行时,所有变量都放在内存中,每一个字节都有一个编号,这个编号就是 “地址”。
可以理解为:
- 变量 = 房间
- 变量值 = 房间里的人
- 地址 = 房间号
查看变量地址用&取地址符。
int a = 10; cout << &a << endl; // 输出 a 的地址,形如:0x61ff1c二、什么是指针?
指针就是专门用来存放地址的变量。
指针变量定义
类型名 *指针变量名;示例:
int a = 10; int *p = &a; // p 是指针,存放 a 的地址int *表示 “指向 int 类型变量的指针”p里存的是地址*p表示取指针指向的那个变量的值(解引用)
三、两个核心符号
&取地址:变量 → 地址*解引用:地址 → 变量本身
int a = 10; int *p = &a; cout << a; // 10 cout << *p; // 10,等价于 a *p = 20; // 通过指针修改 a cout << a; // 20四、指针指向关系图解(易懂版)
a 变量空间 +---------+ | 10 | +---------+ ↑↑ || +---------+ | &a | p 指针变量 +---------+p存的是a的地址*p就是a本身- 修改
*p= 修改a
五、指针的简单操作
int a = 100; int *p = &a; *p = 200; // a 变成 200 cout << *p; // 输出 200 cout << p; // 输出地址 cout << &p; // 指针变量自己的地址六、指针与数组(超级常用)
数组名就是数组首元素的地址!
int arr[] = {10,20,30,40}; int *p = arr; // 等价于 &arr[0]访问数组元素两种写法:
arr[i] ←→ *(p + i)遍历数组(指针版):
for(int i=0; i<4; 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); // 传地址 // x=20 y=10 }八、空指针与野指针
空指针:指向地址 0,表示不指向任何空间
int *p = nullptr; // C++11 推荐野指针:指向未知非法地址,极其危险
int *p; // 没有初始化,野指针
原则:
- 指针一定要初始化
- 不用时置为
nullptr
九、新手高频易错点
- 分不清
&和* - 定义时
int* p和int *p一样,但int* p,q容易误解 - 野指针、空指针解引用导致程序崩溃
- 指针越界访问
- 函数传参时忘记传地址,以为能修改实参
十、今日重点总结
&取地址,*解引用- 指针 = 存地址的变量
*p就是指针指向的变量本身- 数组名 = 首地址,
arr[i] ↔ *(p+i) - 指针做函数参数可以直接修改实参
- 指针必须初始化,避免野指针
