嵌入式学习 day12:指针

📅 2026/8/2 4:59:07
嵌入式学习 day12:指针
根据day11的学习可以得知数组名指向首个元素的地址即 a[n] *(an) 。一、一维字符型数组传参字符串在C语言中通过字符数组存储传递字符串时本质上是传递首地址。1. 两种传参方式cchar str[32] hello; // 方式1数组形式 void fun(char pstr[]) { ... } // 方式2指针形式 void fun(char *pstr) { ... }这两种写法完全等价编译器会把char pstr[]自动翻译成char *pstr。2. 函数内部遍历字符串c// 下标法 void print_str(char *pstr) { int i 0; while (pstr[i] ! \0) { putchar(pstr[i]); i; } } // 指针法 void print_str(char *pstr) { while (*pstr ! \0) { putchar(*pstr); pstr; // 指针向后移动 } }指针法遍历字符串更接近C语言的底层逻辑*pstr取当前字符pstr移到下一个字符。这也是为什么C语言标准库的字符串函数都采用指针实现代码更简洁高效。3. 字符串传参的注意事项cvoid func(char *pstr) { pstr[0] A; // ✅ 可以修改字符串内容 pstr world; // ❌ 只是修改了形参的指向不影响实参 }需要注意的是如果实参是字符串常量如func(hello)函数内不能修改字符串内容因为常量区只读。二、指针函数和函数指针1. 指针函数本质是函数返回值是指针的函数。cint *fun(int a, int b); // 返回 int* 类型 char *get_str(void); // 返回 char* 类型cint *find_max(int *a, int *b) { return (*a *b) ? a : b; // 返回地址 } int main(void) { int x 10, y 20; int *p find_max(x, y); printf(%d\n, *p); // 输出20 return 0; }绝对不能返回局部变量的地址函数结束局部变量被回收返回的地址指向无效内存。2. 函数指针本质是指针指向函数的指针可以通过它间接调用函数。cint (*p)(int, int); // p指向一个返回int、有两个int参数的函数cint add(int a, int b) { return a b; } int sub(int a, int b) { return a - b; } int main(void) { int (*p)(int, int); // 声明函数指针 p add; // 指向add函数 printf(%d\n, p(10, 5)); // 输出15 p sub; // 改指向sub函数 printf(%d\n, p(10, 5)); // 输出5 return 0; }函数指针把函数当做参数传来传去让代码变得更灵活。3. 指针函数与函数指针的区分指针函数函数指针格式int *fun(int, int)int (*p)(int, int)本质函数指针速记函数名带*变量名带*和括号三、const指针const的意思是只读readonly但它修饰的位置不同效果完全不同。1. const修饰指针指向的内容cconst int *p; int const *p; // 和上面等价特点p可以改变指向但不能通过*p修改指向的内容。cint a 10, b 20; const int *p a; p b; // ✅ p可以改指向 *p 30; // ❌ 不能通过p修改值2. const修饰指针变量本身cint *const p;特点p不能改变指向但可以通过*p修改指向的内容。必须初始化cint a 10, b 20; int *const p a; // 必须初始化 p b; // ❌ p不能改指向 *p 30; // ✅ 可以改值a变成303. const同时修饰两者cconst int *const p; int const *const p; // 和上面等价特点p不能改指向也不能通过*p修改值。必须初始化cint a 10; const int *const p a; // 必须初始化 p b; // ❌ 不能改指向 *p 30; // ❌ 不能改值4. const指针总结写法const修饰的是能改指向能改值const int *p*p指向的内容✅❌int const *p*p指向的内容✅❌int *const pp指针本身❌✅const int *const p*p和p❌❌int const *const p*p和p❌❌四、今日总结今天的核心要点如下1.一维字符型数组传参char pstr[]和char *pstr完全等价指针法遍历字符串更常用2.指针函数 vs 函数指针int *fun(int, int)指针函数返回指针int (*p)(int, int)函数指针指向函数3.const指针看const右边修饰谁const int *p/int const *p值不能改指向能改int *const p指向不能改值能改const int *const p/int const *const p都不能改今日感悟一维字符数组传参让我们明白字符串函数的底层机制const指针经常用来保护数据不被意外修改函数指针是实现回调机制的基石。