C语言进阶篇(指针进阶(续))

函数指针数组

已知函数指针格式如下:

(pf是函数指针)

则可推出函数指针数组:

  格式如上:其中Add,Sub,Mul,Div均为函数,arr就是函数指针的数组

若函数指针数组的格式如下

则下图为指向函数指针数组的指针        

具体使用实例:

#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("***请选择计算方式***\n");
	printf("***1.加法 2.减法 ***\n");
	printf("***3.乘法 4.除法 ***\n");
	printf("******************\n");
}
int (*pf[5])(int, int) = { 0,Add,Sub,Mul,Div };
int main()
{
	menu();
	int input, x, y;
	scanf_s("%d", &input);
	if (input == 0)
	{
		printf("退出");
	}
	else if (1 <= input && input <= 4)
	{
		printf("请输入两位有效数字");
		scanf_s("%d %d", &x, &y);

		int ret = pf[input](x, y);
		printf("%d", ret);
	}
	else
	{
		printf("选择错误");
	}
	return 0;

回调函数

冒泡排序

基础版:

#include<stdio.h>
void bubble_sort(int arr[], int sz)
{
	int i;
	for(i=0;i<sz-1;i++)
	{
		int j;
		for(j=0;j<sz-1-i;j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int stm = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = stm;
			}
		} 
	}
}
int main()
{
	int arr[] = { 24,62,49,91,78,66,73 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz);
	int n = 0;;
	for (n = 0; n < sz ; n++)
	{
		printf("%d ", arr[n]);
	}
	return 0;
}

如果数组里的值本来就是从小到大排序,这样的代码就显得效率过低;

所以要使用qsort函数(使用快速排序的思想):

使用示例:

进阶版:

头文件:#include<stdlib.h>

起始位置例如上述代码中的:arr

元素个数即为:sz

元素的大小(并非所有元素大小的和):sizeof(arr[0])

对于第四个则需要传送一个函数指针,需自定义一个函数int cmp_int(const void*e1,const void*e2)

而对于int cmp_int函数也有规定:

比较两个整型元素

e1指向一个元素,e2指向另一个元素 

若e1指向的值<e2指向的值,则return 小于0的值

若e1指向的值=e2指向的值,则return 0

若e1指向的值>e2指向的值,则return 大于0的值

注:因为e1接收的是地址,所以需对其进行解引用操作

关于void*的介绍:

int a =10;
char*b=&a;//这种写法是错误的,&a是int*类型的,两者类型不同会报错;
void*d=&a;//而这种情况不会报错;
因为void*是无具体类型的指针,可接受任意类型的地址
所以不能解引用操作,也不能加减整数的操作        

则*e1需强制转换类型,即:*(int*)e1

使用qsort函数解决冒泡排序问题:

#include<stdio.h>
#include<stdlib.h>
int cmp_int(const void* e1, const void* e2)
{
	return (*(int*)e1 - *(int*)e2);
}
int main()
{
	int arr[] = { 24,62,49,91,78,66,73 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	int n = 0;;
	for (n = 0; n < sz ; n++)
	{
		printf("%d ", arr[n]);
	}
	return 0;
}

用qsort来排序结构数据:

struct Stu(名字)
{
char name[20];
int age;
};
int cmp_stu_by_name(const void*e1,const void*e2)
{
return strcmp(((struct Stu*)e1)->,((struct Stu*)e2)->);
}
int cmp_stu_by_age(const void*e1,const void*e2)
{
return ((struct Stu*)e1)->age-((struct Stu*)e2)->age;
int main()
{
struct Stu s[]={{"zhangsan",16},{“lisi",41},{"wangwu",61}};
int sz=sizeof(s)/sizeof(s[0]);
qsort(s,sz,sizeof(s[0]),cmp_stu_by_name);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值