【C语言】终の指针(前篇)



个人主页点这里~

指针初阶点这里~

指针初阶2.0点这里~

指针进阶点这里~


终の指针

一、回调函数

回调函数就是⼀个通过函数指针调用的函数。

把一个函数的指针作为参数传递给另一个函数,当这个指针被调用其所指向的函数时,被调用的函数就是回调函数

简单的说就是函数套函数,还是指针的用法,把相似的代码抽象成函数

在上一篇博文指针进阶中讲到的计算器程序,可以被简化

指针进阶点这里~

这里我们复制一下上一篇博文的代码

c 复制代码
#include <stdio.h>
int add(int x,int y)
{
	return x + y;
}
int sub(int x, int y)
{
	return x - y;
}
int mul(int x, int y)
{
	return x * y;
}
int div(int x, int y)
{
	return x / y;
}
//定义四种函数
void menu()
{
	printf("**************************************************\n");
	printf("********  1.add         2.sub  *******************\n");
	printf("********  3.mul         4.div  *******************\n");
	printf("****************  0.exit  ************************\n");
	printf("**************************************************\n");
}
//打印一个菜单函数
int main()
{
	int x = 0;
	int y = 0;
	int input = 1;
	int(*p[5])(int x,int y) = {NULL,add,sub,mul,div};
	//首位放NULL,那么可以从1开始访问函数指针,当然也可以不放,但这么放更好,可以继续往下看,看看为什么这么放更好
	menu();
	do
	{
		scanf("%d", &input);
		if (input >= 1 && input <= 4)
		{
			printf("请输入->");
			scanf("%d %d", &x, &y);
			printf("%d\n", (*p[input])(x, y));
			//这里input就不会为零,whlie也会继续运行,我们写代码时要考虑上下不干扰的一致性
		}
		else if (input == 0)
		{
			printf("退出\n");
		}
		else
		{
			printf("请重新输入\n");
		}

	} while (input);
	return 0;
}
------------------------------------------------

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
                        
原文链接:https://blog.csdn.net/s_little_monster/article/details/136422391
c 复制代码
#include <stdio.h>
int add(int x,int y)
{
	return x + y;
}
int sub(int x, int y)
{
	return x - y;
}
int mul(int x, int y)
{
	return x * y;
}
int div(int x, int y)
{
	return x / y;
}
void menu()
{
	printf("**************************************************\n");
	printf("********  1.add         2.sub  *******************\n");
	printf("********  3.mul         4.div  *******************\n");
	printf("****************  0.exit  ************************\n");
	printf("**************************************************\n");
}
//到这里以上都是相同的
void func(int (*pf)(int, int))
{
	int ret = 0;
	int x, y;
	printf("请输入:");
	scanf("%d %d", &x, &y);
	printf("结果为:%d\n", pf(x, y));
}
//这里给了一个函数,函数的参数是一个函数指针,通过函数指针来调用函数,这就是回调函数
int main()
{
	int input = 1;
	do
	{
		menu();
		scanf("%d", &input);
		switch(input)
		{
			case 1:
				func(add);
				break;
			case 2:
				func(sub);
				break;
			case 3:
				func(mul);
				break;
			case 4:
				func(div);
				break;
			case 0:
				printf("退出程序\n");
				break;
			default:
				printf("请重新输入:\n");
				break;
		}
//这里我们换成switch函数,便于理解回调函数
	} while (input);
	return 0;
}

二、qsort函数

qsort函数是一个快速排序函数

头文件为

c 复制代码
#include <stdlib.h>

1、整形比较

这里我们想要完成一个升序。

1、qsort第一个变量为数组首元素地址

2、qsort第二个变量为数组长度

3、qsort第三个变量为数据类型的长度

4、创建一个函数,参数为数组指针,将相邻的两个元素相减,返回一个值到qsort的第四个参数上,为一个区分正负零的数字 ,前边的数字减后边(序号小减序号大)的数字为升序,反之则为降序

c 复制代码
#include <stdio.h>
int int_cmp(const void* p1, const void* p2)
{
	return (*(int*)p1 - *(int*)p2);
}
int main()
{
	int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
	int i = 0;

	qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), int_cmp);
	for (i = 0; i < sizeof(arr) / sizeof(arr[0]); i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
	return 0;
}

2、结构数据比较

①结构体

我们描述一个学生,我们用四个内容:

c 复制代码
struct Stu
{
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
};

```c
struct Stu
{
	char name[20];//名字
	int age;//年龄
	char sex[5];//性别
	char id[20];//学号
}s1;//这里不要忘记分号;s1这也是一种定义
struct Stu s2;//定义结构体变量
struct Stu s3 = { "zhangsan",18,"man","1234567" };//初始化
struct Stu s4 = {.id="1234568",.age=19,.sex="woman",.name="lisi"};//按自己想要的顺序初始化
struct Node
{
 int data;
 struct Stu s5;
 struct Node* next;
}n1 = { 10, {"zhaowu",20,"man","1234569"}, NULL };//结构体嵌套初始化

-> 的使用

c 复制代码
int main()
{
	struct Data
	{
		int a, b, c;
	};
	struct Data* p;
	struct Data A = { 1,2,3 };
	int x;
	p = &A;
	x = p->a;
	printf("%d", x);
}

取出p所指向的结构体中包含的数据项a赋值给x

③结构数据比较

c 复制代码
struct Stu 
{
	char name[20];
	int age;
};
//1、按照年龄来⽐较
int cmp_stu_by_age(const void* e1, const void* e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//2、按照名字来⽐较
int cmp_stu_by_name(const void* e1, const void* e2)
{
	return strcmp(((struct Stu*)e1)->name, ((struct Stu*)e2)->name);
}
//strcmp - 是库函数,是专⻔⽤来⽐较两个字符串的⼤⼩的
//3、按照年龄来排序
void test2()
{
	struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_age);
}
//4、按照名字来排序
void test3()
{
	struct Stu s[] = { {"zhangsan", 20}, {"lisi", 30}, {"wangwu", 15} };
	int sz = sizeof(s) / sizeof(s[0]);
	qsort(s, sz, sizeof(s[0]), cmp_stu_by_name);
}
int main()
{
	test2();
	test3();
	return 0;
}

今日分享完毕,谢谢收看

相关推荐
小蜗牛慢慢爬行5 分钟前
有关异步场景的 10 大 Spring Boot 面试问题
java·开发语言·网络·spring boot·后端·spring·面试
荒古前11 分钟前
龟兔赛跑 PTA
c语言·算法
Colinnian15 分钟前
Codeforces Round 994 (Div. 2)-D题
算法·动态规划
Algorithm157615 分钟前
云原生相关的 Go 语言工程师技术路线(含博客网址导航)
开发语言·云原生·golang
用户00993831430121 分钟前
代码随想录算法训练营第十三天 | 二叉树part01
数据结构·算法
shinelord明24 分钟前
【再谈设计模式】享元模式~对象共享的优化妙手
开发语言·数据结构·算法·设计模式·软件工程
დ旧言~31 分钟前
专题八:背包问题
算法·leetcode·动态规划·推荐算法
Monly2131 分钟前
Java(若依):修改Tomcat的版本
java·开发语言·tomcat
boligongzhu32 分钟前
DALSA工业相机SDK二次开发(图像采集及保存)C#版
开发语言·c#·dalsa