
一、指针数组主体是数组数组元素为指针1. 概念定义语法格式基类型 * 数组名[长度];[]优先级高于*变量先与[]结合形成数组数组内每一个元素都是对应类型的指针64 位系统单个指针占 8 字节数组总字节 指针大小 × 数组长度。2. 示例代码#include stdio.h int main() { char *pstr[3] {Hello, World, C Language}; printf(指针数组整体占用字节%ld\n, sizeof(pstr)); printf(单个数组元素(指针)占用字节%ld\n, sizeof(pstr[0])); for (int i 0; i 3; i) { printf(pstr[%d] %s 地址%p\n, i, pstr[i], pstr[i]); } char **p pstr; printf(二级指针访问字符串%s\n, *p); return 0; }3. 使用场景存储多组字符串、命令行参数char *argv[]、批量管理地址集合。二、数组指针主体是指针指向一整个数组1. 概念定义语法格式基类型 (*指针名)[数组长度];()强制*与变量名绑定主体为指针该指针专门指向完整数组指针1会一次性偏移整个数组的内存大小指针本身固定占 8 字节64 位系统与数组长度无关arr是数组首元素地址int*arr是数组整体地址数组指针int (*)[N]。2. 示例代码#include stdio.h int main() { int a[5] {10, 20, 30, 40, 50}; int (*p)[5] a; printf(数组指针自身字节%ld\n, sizeof(p)); printf(数组首地址%pp1地址%p\n, a[0], p 1); for (int i 0; i 5; i) { printf(%d , *(*p i)); } printf(\n); int two[2][3] {{1, 2, 3}, {4, 5, 6}}; int (*p2)[3] two; printf(二维数组元素%d\n, *(*p2 1)); return 0; }3. 使用场景二维数组函数传参、批量操作整块连续数组内存。三、指针函数主体是函数返回值为指针1. 概念定义语法格式基类型 * 函数名(形参列表);主体是函数函数执行完成后返回一个对应类型的指针禁止返回局部栈变量、局部数组地址函数结束栈内存释放产生野指针合法返回全局变量地址、static 静态变量地址、字符串常量、堆内存地址、传入参数地址。2. 示例代码#include stdio.h // 指针函数返回char*字符串指针 char *getWord(int num) { if (num 1) return Apple; else if (num 2) return Banana; else return Orange; } int *getStaticNum() { static int num 999; return num; } int main() { char *str getWord(2); printf(指针函数返回字符串%s\n, str); int *p getStaticNum(); printf(指针函数返回数值%d\n, *p); return 0; }3. 错误示例野指针char *badFunc() { char buf[] test; return buf; }4. 使用场景封装获取内存地址的逻辑、字符串处理、动态内存封装。四、函数指针主体是指针存储函数入口地址1. 概念定义语法格式返回值类型 (*指针名)(形参类型列表);主体是指针用于存放函数的入口地址函数名本身就是地址指针匹配固定返回值、固定参数列表的函数核心用途回调函数、函数数组、动态切换执行逻辑。2. 基础示例代码#include stdio.h int add(int a, int b) { return a b; } int sub(int a, int b) { return a - b; } int main() { int (*pfun)(int, int) NULL; pfun add; printf(10 5 %d\n, pfun(10, 5)); pfun sub; printf(10 - 5 %d\n, pfun(10, 5)); int (*funArr[2])(int, int) {add, sub}; printf(20 3 %d20 - 3 %d\n, funArr[0](20, 3), funArr[1](20, 3)); return 0; }3. 进阶回调函数示例#include stdio.h void calc(int a, int b, int (*func)(int, int)) { printf(计算结果%d\n, func(a, b)); } int mul(int a, int b) { return a * b; } int main() { calc(6, 7, mul); // 将函数作为参数传入回调执行 return 0; }4. 使用场景回调函数、插件化开发、状态机、函数批量调度。五、四大概念对比表名称本质标准语法核心特征64 位系统内存大小指针数组数组元素全为指针int *arr[5];[]优先级高存储多个内存地址5 × 8 40 字节数组指针指针指向完整数组int (*p)[5];()包裹 *指针偏移跳过整个数组固定 8 字节指针函数函数返回指针类型int *func();调用后返回内存地址禁止返回局部栈地址无占用代码存文本段函数指针指针存储函数入口地址int (*p)(int);可赋值函数、用作回调参数固定 8 字节六、快速区分口诀运算符优先级()[]*先绑定变量名的符号决定主体int *a[5]先a[5]数组元素int*→指针数组int (*a)[5]先*a指针指向int[5]数组 →数组指针int *a()a()是函数返回int*→指针函数int (*a)()*a是指针指向无参 int 函数 →函数指针。七、总结四类概念是 C 指针进阶核心分水岭区分关键在于运算符优先级数组相关分清「存放指针的数组」和「指向数组的指针」函数相关分清「返回指针的函数」和「指向函数的指针」开发实操指针数组多字符串管理数组指针二维数组传参指针函数封装地址返回逻辑函数指针回调解耦、动态逻辑调度。