一、二维数组传参的本质最核心很多人不理解为什么二维数组传参行可以省略列必须写答案就在二维数组的本质里。二维数组在内存中是一维连续存放int arr[3][5] 逻辑上是3行5列但物理上是连续15个int。它可以理解为一个数组里面的每个元素又是一个数组。二维数组名代表首行地址arr → 指向第一行这个数组的地址类型是 int (*)[5]arr1 → 指向第二行直接跳过一行5个int二维数组传参本质是传数组指针形参里写 int arr[3][5] 只是语法糖编译器真正识别的是int (*arr)[5]所以下面两种写法完全等价4. 为什么列必须写因为指针要知道1 跳多少字节。int (*arr)[5] 告诉编译器每次加1跳过5个int。不写列数编译器无法计算偏移直接报错。二、数组指针指向数组的指针定义数组指针指向一个完整数组的指针它指向的是整个数组不是单个元素。写法() 优先级高于 [] 所以 p 先和 * 结合 → 是指针指向包含5个int的数组区分指针数组 vs 数组指针使用场景主要用于二维数组传参、遍历二维数组。示例三、函数指针变量指向函数的指针本质函数名就是函数的入口地址函数指针就是用来存这个地址的指针。定义格式例子指向一个返回int、参数为两个int的函数使用步骤定义函数函数指针指向它通过指针调用函数四、函数指针数组存函数指针的数组定义把多个同类型函数指针放进一个数组里就是函数指针数组。写法fpArr 先和 [4] 结合 → 是数组每个元素 int (*)(int,int) 函数指针用途统一管理一批功能相似的函数为后面转移表做准备。五、转移表函数指针数组经典用法什么是转移表用函数指针数组实现分支选择替代大量 if / switch 代码更整洁、易扩展。经典案例计算器优点不用写冗长switch新增函数只需往数组里加执行效率更高可读性强六、一张表总结面试必背二维数组传参本质退化为数组指针列数必须写数组指针 int (*p)[n] → 指向数组用于二维数组函数指针 int (*fp)(int,int) → 指向函数函数指针数组 int (*fpArr[])(int,int) → 存函数指针转移表函数指针数组实现分支优雅替代switch