嵌入式开发学习日志() day14 持续更新中

📅 2026/8/6 6:06:21
嵌入式开发学习日志() day14 持续更新中
一、指针数组1. 什么是“指针数组”本质它是一个数组。特点该数组中保存的每一个元素都是指针地址。2. 定义语法int *a[5];int *表示数组中保存的数据类型是int *整型指针。[5]表示该数组可以保存 5 个这样的指针。3. 初始化方式(1) 初始化为空char *p NULL; char *p[5] {NULL}; // 将5个字符型指针全部初始化为 NULL(2) 初始化指向字符串常量char *p[5] {hello, world, how, are, you};p[0]保存字符串 hello 的首地址。p[1]保存字符串 world 的首地址。...以此类推。4. 内存模型图解当我们执行char *p[5] {hello, ...};时内存布局如下左侧栈区p数组本身存储的是一个个地址如0x5000,0x3000等。右侧字符串常量区真正的字符串数据存储在只读区域数组中的指针指向它们。5. 重点辨析指针数组 vs 二维字符数组这是面试和考试中的高频考点// 二维字符数组 char str[3][100] {hello, world, how}; sizeof(str) 300 字节 // 3 * 100 // 指针数组 char *pstr[3] {hello, world, how}; sizeof(pstr) 24 字节 // 64位系统下 3 * 8区别总结存储内容不同二维数组保存的是字符串本身拷贝了一份指针数组保存的是字符串的首地址引用。空间效率如果要保存多个长度不一的字符串使用指针数组更节省空间且操作更灵活。二、二级指针1. 什么是“二级指针”本质它还是一个指针。含义它是一个“指向指针的指针”即保存的是另一个指针变量的地址。int **p保存整型指针的地址。char **p保存字符型指针的地址。2. 两大核心应用场景修改主调函数中的指针变量如果你想在被调函数中修改主调函数里定义的指针变量例如让指针指向新的内存必须传递该指针的地址即二级指针。接收指针数组的数组名指针数组的数组名在作为参数传递时本质上就是一个二级指针。char *str[3] {hello, world, how}; // str 的类型就是 char **3. 传参机制图解值传递 vs 地址传递理解二级指针的关键在于理解 C 语言的函数传参机制。(1) 普通变量的传递值传递fun(n)- 无法修改主调函数的n。地址传递一级指针fun(n)- 可以修改主调函数的n。(2) 指针变量的传递值传递传一级指针void fun(char *pstr) { pstr world; } // 仅修改了形参实参不变结果主调函数中的指针依然指向 hello。地址传递传二级指针void fun(char **pstr) { *pstr world; } // 通过解引用修改了实参指向的内容结果主调函数中的指针被成功修改为指向 world。三、指针函数1. 概念本质它是一个函数。定义返回值类型是指针类型的函数。2. 返回值的注意事项避坑指南指针函数能返回什么样的指针这是一个关于生命周期的问题。❌绝对不能返回局部变量的地址局部变量、局部数组。因为函数结束后栈内存被释放返回的地址将变成野指针。char str[32] hello world; // 局部数组 return str; // 错误✅可以安全返回static修饰的静态变量地址生命周期贯穿程序始终。全局变量的地址。字符串常量的地址如return hello world存储在只读区。通过参数传递进来的地址如strcpy返回dest。通过malloc在堆区申请且未被free的空间。四、函数指针1. 概念本质它是一个指针。含义指向函数的指针。函数名本身就是函数的入口地址。2. 语法辨析这是最容易混淆的地方请注意括号的位置函数声明int fun(int, int);—— 声明一个名为 fun 的函数。指针函数int *fun(int, int);—— 声明一个名为 fun 的函数返回值是 int*。函数指针int (*pfun)(int, int);—— 定义一个名为 pfun 的指针指向参数为两个 int、返回值为 int 的函数。总结口诀看到(*名称)它就是指针看到*名称()它就是函数。3. 使用步骤定义int (*pfun)(int, int) NULL;通常占 4 或 8 字节。赋值int add(int n1, int n2) { ... } pfun add; // 或者 pfun add;调用pfun(1, 2); // 等价于 (*pfun)(1, 2);4. 高级应用回调函数函数指针最大的威力在于回调函数。定义将函数作为参数传递给另一个函数。目的降低代码耦合度实现多态效果减少重复代码例如qsort排序函数就是通过回调函数来决定排序规则的。