嵌入式开发学习———Linux环境下C语言学习(十)
本文摘要介绍了C语言核心概念:1) 函数指针用于动态调用函数,实现策略模式;2) 递归函数需注意终止条件,适用阶乘/树遍历等场景;3) 回调函数实现异步编程,常见于事件处理;4) 动态内存管理需手动释放;5) 结构体组织复合数据,演示了数组和指针操作。附四个编程实例:二进制递归转换、斐波那契数列、结构体应用、赶鸭子递归问题(经7村剩2鸭求初始数量)。这些示例展示了递归、结构体和指针的综合运用。
函数
函数指针
函数指针是存储函数地址的变量,允许通过指针动态调用不同函数。定义时需匹配目标函数的返回类型和参数列表,常用于实现策略模式或动态行为切换。例如,将排序算法的比较逻辑抽象为函数指针,便于灵活替换排序规则。
递归函数
递归函数通过调用自身解决问题,需包含明确的终止条件以避免无限循环。典型应用包括阶乘计算、树形结构遍历等。递归虽简化代码逻辑,但可能因栈帧累积导致栈溢出,尾递归优化可缓解此问题。
回调函数
回调函数通过将函数作为参数传递给其他函数,实现异步或事件驱动编程。主函数在特定条件(如事件触发、异步操作完成)下调用回调函数。常见于库设计(如qsort)或GUI事件处理,解耦调用方与被调用方逻辑。
内存分配
动态内存分配通过malloc、calloc等函数在堆上申请空间,需手动free释放以避免泄漏。静态分配在编译时确定,而自动变量(局部变量)存在于栈中。合理选择分配方式可优化内存使用效率,如动态分配适应不确定大小的数据结构。

结构体
结构体的定义
结构体(struct)是C语言中一种用户自定义的复合数据类型,允许将不同类型的数据组合成一个整体。通过结构体,可以创建包含多个成员变量的复杂数据结构。
声明与初始化
结构体的声明通常使用struct关键字:
struct Person {
char name[50];
int age;
float height;
};
初始化可以直接赋值或通过成员访问:
struct Person p1 = {"Alice", 25, 1.65}; // 直接初始化
struct Person p2;
p2.age = 30; // 成员赋值
成员访问
通过.操作符访问结构体成员:
printf("Name: %s, Age: %d", p1.name, p1.age);
若结构体指针使用->操作符:
struct Person *ptr = &p1;
printf("Height: %.2f", ptr->height);
用途
结构体常用于表示现实世界的实体(如学生、商品),或组织复杂数据(如链表节点、文件元数据)。
作业:
- 用递归输出数的二进制
运行结果:include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> void binary(int); int main(int argc, const char *argv[]) { int num; puts("请输入想要转成二进制的数:"); scanf(" %d",&num); puts("转换为二进制为:"); binary(num); putchar(10); return 0; } void binary(int num) { int num1=num; if(num1!=0) { num1/=2; binary(num1); } printf("%d",num%2); }
- 递归输出斐波那契数列
运行结果:#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> int Fibonacci_sequence(int); int main(int argc, const char *argv[]) { int n; puts("请输入想要打印的位数:"); scanf("%d",&n); puts("斐波那契数列如下:"); for(int i=1;i<=n;i++) printf("%d ",Fibonacci_sequence(i)); putchar(10); return 0; } int Fibonacci_sequence(int n) { if(n<=2) return 1; else return Fibonacci_sequence(n-1)+Fibonacci_sequence(n-2); }
- 尝试实现结构体指针和结构体数组
运行结果:#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> //重定义结构体变量和指针的定义数据类型 typedef struct STU { char name[50]; int age; int score; }STU,*STUptr; int main(int argc, const char *argv[]) { //实现结构体数组初始化及输出 STU stuarr[5]={{"张三",20,87},{"李四",21,78},{"王二麻子",23,89},\ {"刘大疤",28,90},{"赵铁柱",19,70}}; for(int i=0;i<5;i++) printf("姓名:%s\t年龄:%d\t分数:%d\n",stuarr[i].name,\ stuarr[i].age,stuarr[i].score); //定义一个结构体变量 STU stuL={"杨武",22,99}; //定义一个结构体指针,指向上面定义的结构体变量并用指针的方式输出它 STUptr L=&stuL; printf("姓名:%s\t年龄:%d\t分数:%d\n",L->name,L->age,L->score); return 0; }
- 赶鸭子问题:一个人赶着鸭子去村庄卖,每经过一个村子卖出一半又一只,经过七个村庄后还剩下两只鸭子,问出发时共赶了多少只鸭子
运行结果:#include <stdio.h> #include <string.h> #include <stdlib.h> #include <math.h> int duck(int num,int day) { static int i=1; while(i<day) { i++; num=duck((num+1)*2,day); } return num; } int main(int argc, const char *argv[]) { int num,day; puts("请输入赶鸭子的天数和最后所剩的鸭子数:"); scanf(" %d %d",&day,&num); puts("得最开始所带鸭子数:"); printf("%d\n",duck(num,day)); return 0; }
更多推荐



所有评论(0)