前言
今日聚焦指针进阶核心难点,内容围绕void万能指针、二级指针、指针数组、数组指针、二维数组传参展开,全程侧重理论考点,无多余练习题,整理应试与嵌入式高频知识点。
一、void指针(万能无类型指针)
1. 核心作用
- 通用存储:仅用来存放任意内存地址,不绑定数据类型
- 泛型传参:函数传参时,任意类型指针均可转为void*,实现一个函数兼容所有数据类型
2. 基础语法规则
- char* / int* / double* 可以自动隐式转换为 void*
- void* 无法直接解引用*p、不能p++/p–偏移,编译器无法确定字节步长
- 读写、偏移前,必须强制转换为对应具体指针类型
3. 示例
// 给指定内存地址赋值
*((int *)((void *)0x12345678)) = 0x11223344;
二、二级指针
1. 定义
二级指针:存放一级指针变量地址的指针,格式:int **q
2. 核心使用场景
- 函数内部想要修改外部一级指针本身的指向,必须传入一级指针的地址(二级指针)
- 字符串数组、指针数组做函数传参,常规需要二级指针搭配长度使用
3. 层级通俗理解
- a:普通整型变量
- p=&a:一级指针,存放变量a的地址,*p代表a的值
- q=&p:二级指针,存放一级指针p的地址,*q代表p,**q代表a的值
三、指针数组 & 数组指针(考试最易混淆区分)
3.1 指针数组
- 本质:数组,数组内每一个元素都是同类型指针
- 定义格式:int *a[5];
- 解析:[]优先级高于*,a先和[5]结合成为数组,元素为int*指针
- 内存:5个int指针,在32位系统占用20字节
- 典型用途:存储多组字符串,实现批量字符串管理
3.2 数组指针
- 本质:指针,专门指向一整个数组
- 定义格式:int (*p)[5];
- 解析:括号改变优先级,p先和*结合为指针,指向长度为5的int数组
- 内存:仅占8字节(64位系统)
- 典型用途:二维数组传参,专门接收二维数组数组名
3.3 极简区分口诀
- 不带括号*a[]:指针数组(数组,装一堆指针)
- 带括号(*a)[]:数组指针(指针,指向一整个数组)
四、一维数组特殊规则
- 数组名a常规等价于&a[0],是首元素地址
- 两种例外:
- sizeof(a):计算整个数组占用总字节
- &a:取整个数组的首地址,类型为数组指针
- 数组指针解引用*(&a),类型降级,变回首元素指针int*
五、二维数组与传参
1. 二维数组底层逻辑
int a[2][3] = {1,2,3,4,5,6};
- a:指向一整行的数组指针
- a[0]、*a:指向本行第一个元素的一级指针
- a[m][n]等价写法:*( *(a+m)+n )
2. 二维整型数组传参规范
函数形参必须写明单行元素个数,行数可省略:
int fun(int (*parray)[3], int len);
// 等价写法
int fun(int parray[][3], int len);
3. 元素访问通用写法
a[m][n]
*(a[m]+n)
*(*(a+m)+n)



