Day 20 指针进阶2 4.4

指向函数指针数组的指针。

int main()
{
    int (*pf)(int, int) = &Add;
    //函数指针。

    int(*pfarr[4])(int,int);
    //函数指针数组。
    
    int (*(* p3)[4])(int, int) = &pfarr;
    //p3是一个指向函数指针数组的指针
}

回调函数

通过函数指针调用的函数,把函数的指针(地址)作为参数传递给另一个函数,使这个指针被用来调用其所指向函数。

void test()
{
	printf("hehe\n");
}

void print_hehe(void (*p)())
{
	if (1)
		p();
}

int main()
{
	print_hehe(test);
	return 0;
}

qsort函数

void qsort( void *base, size_t num, size_t width, int (*cmp)(const void *e1, const void *e2 ) );
//使用库函数<stdlib.h>。
//后面的*cmp是一个函数指针。
//base存放的是待排序数组的起始位置。
//num是数组的元素个数。
//width是一个元素的字节大小。
//e1,e2是待排序的两个元素地址。
//当e1小于e2,返回<0的数字。
//当e1大于e2,返回>0的数字。
//当e1等于e2,返回0。

int cmp_int(const void* e1, const void* e2)
{
	/*if (*(int*)e1 > *(int*)e2)
		return 1;
	else if (*(int*)e1 == *(int*)e2)
		return 0;
	else
		return -1;*/
    //或者:
	return (*(int*)e1 - * (int*)e2);
} 

//void*类型的数据要进行强制转换。
void test2()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	//排序为升序
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	//使用cmp_int来接受函数指针。
    print_arr(arr, sz);
}

使用qsort排序结构体:

struct Stu
{
	char name[20];
	int age;
	double score;
};

int cmp_stu_by_age(const void* e1, const void*e2)
{
	return ((struct Stu*)e1)->age - ((struct Stu*)e2)->age;
}
//按照年龄来排序。

int cmp_stu_by_name(const void* e1, const void* e2)
{
	return strcmp( ((struct Stu*)e1)->name , ((struct Stu*)e2)->name);
}
//按照名字来排序,使用strcmp来进行字符比较。

void test3()
{
	struct Stu arr[3] = { {"zhangsan", 20, 55.5},{"lisi", 30, 88.0},{"wangwu", 10, 90.0}};
	int sz = sizeof(arr) / sizeof(arr[0]);

	//qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_age);
	qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_name);
}

注意:

qsort默认排的是升序,要改成降序可以利用反逻辑的原理,返回值中颠倒数据,例如:

int cmp_stu_by_age(const void* e1, const void*e2)
{
	return ((struct Stu*)e2)->age - ((struct Stu*)e1)->age;
}
//把e1和e2位置交换。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值