函数

函数指针

函数指针是存储函数地址的变量,允许通过指针动态调用不同函数。定义时需匹配目标函数的返回类型和参数列表,常用于实现策略模式或动态行为切换。例如,将排序算法的比较逻辑抽象为函数指针,便于灵活替换排序规则。

递归函数

递归函数通过调用自身解决问题,需包含明确的终止条件以避免无限循环。典型应用包括阶乘计算、树形结构遍历等。递归虽简化代码逻辑,但可能因栈帧累积导致栈溢出,尾递归优化可缓解此问题。

回调函数

回调函数通过将函数作为参数传递给其他函数,实现异步或事件驱动编程。主函数在特定条件(如事件触发、异步操作完成)下调用回调函数。常见于库设计(如qsort)或GUI事件处理,解耦调用方与被调用方逻辑。

内存分配

动态内存分配通过malloccalloc等函数在堆上申请空间,需手动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);

 

 

用途

结构体常用于表示现实世界的实体(如学生、商品),或组织复杂数据(如链表节点、文件元数据)。

 

 作业:
 

  1. 用递归输出数的二进制
    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);
    }
    
    运行结果:
  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);
    }
    
    运行结果:

  3. 尝试实现结构体指针和结构体数组
    #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;
    }
    
    
    运行结果:
  4. 赶鸭子问题:一个人赶着鸭子去村庄卖,每经过一个村子卖出一半又一只,经过七个村庄后还剩下两只鸭子,问出发时共赶了多少只鸭子
    #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;
    }
    
    运行结果:

 

 

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐