指针进阶(二)

指向函数指针数组的指针

指向函数指针数组的指针是一个指针
定义方式
void(*(*parr)[5])(const char*)
(*parr)[5]这个是一个数组指针。向外看void(* )(const char*)是一个函数指针类型。那么连起来就是,数组指针的类型是函数指针那么它指向的就是一个函数指针数组。可以类比一下,指向整型类型的数组指针:
int (*parr)[5]
函数指针数组int (*parr[5])(int , int)

回调函数

概念解释:
回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用,用于对该事件或条件进行响应。

演示qsort函数的使用

首先我先解释以下void指针的含义
void
无具体类型的指针,所以它可以接收任何类型的地址。
void* 的指针不能解引用操作符
qsort函数默认是升序的。

qsort函数的解释,截至cplusplus网站
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//qsort函数的解释

struct stu
{
	char name[10];
	int age;
};
int cmp_age(const void* p1, const void* p2)
{
	return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
}
int cmp_name(const void* p1, const void* p2)
{
	return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
}


void test3()
{
	struct stu s[] = { {"zhangsan",20},{"lisi",15},{"wangwen",30} };
	qsort(s, sizeof(s) / sizeof(s[0]), sizeof(s[0]), cmp_name);
}
//qsort 函数的使用

//通过函数指针去调用函数称为回调函数,回调函数是一个动作。
int cmp_int(const void* p1, const void* p2)
{
	return *(int*)p1 - *(int*)p2;
}
void print(int arr[],int sz)
{
	for (int i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}
void test1()
{
	int arr[10] = { 3,1,2,5,4,6,7,9,8,10 };
	qsort(arr, sizeof(arr) / sizeof(arr[0]), sizeof(int), cmp_int);
	int sz = sizeof(arr) / sizeof(arr[0]);
	print(arr, sz);
}
int main()
{
	test1();
	//test2();
	//test3();
	return 0;
}

qsort的好处是

  • 现成的 可以排序任意类型的数据

自主实现一个通用型的冒泡排序

int cmp_age(const void* p1, const void* p2)
{
	return ((struct stu*)p1)->age - ((struct stu*)p2)->age;
}
#include <stdio.h>
#include <string.h>
int cmp_name(const void* p1, const void* p2)
{
	return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
}



void swap_sort(char* p1, char* p2,int width)
{
	int i = 0;
	while (i < width)
	{
		char temp = *p1;
		*p1 = *p2;
		*p2 = temp;
		p1++;
		p2++;
		i++;
	}
}
void bubble_sort(void* base, int sz,int width,int(*cmp_sort)(const void* p1,const void* p2))
{
	for (int i = 0; i < sz - 1; i++)
	{
		for (int j = 0; j < sz - i - 1; j++)
		{
			//判断大小
			if (cmp_sort((char*)base+j*width,(char*)base+(j+1)*width)>0)
			{
				//开始交换
				swap_sort((char*)base + j * width, (char*)base + (j + 1) * width, width);
			}
		}
	}
}

	
int main()
{
	struct stu s[] = { {"zhangsan",20},{"lisi",15},{"wangwen",30} };
	bubble_sort(s, sizeof(s) / sizeof(s[0]), sizeof(s[0]), cmp_name);
	for (int i = 0; i < 3; i++)
	{
		printf("%s %d\n", s[i].name, s[i].age);
	}
	return 0;
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值