C语言进阶 - 指针3 - 知识点整理

目录

一、使用回调函数,模拟实现qsort:

 二、使用回调函,模拟实现qsort(采用冒泡的方式)

三、 指针和数组笔试题解析​


 

回调函数:

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

//代码1:
//冒泡排序 -- 只能运用于整形
//void bubble_sort(int* arr,int sz)
//{
//	
//	int i = 0;
//	int flag = 1;//如果第一趟一个都没有交换,说明这个数组就是按照给定顺序来的
//	for (i = 0;i < sz - 1;i++)//趟数,10个元素应该进行9趟,最后一个元素,不需要排序
//	{
//		//每趟交换  第一趟进行9次交换
//		int j = 0;
//		for (j = 0; j< sz -1 - i ;j++)
//		{
//			if (arr[j] > arr[j+1])
//			{
//				int temp = arr[j];
//				arr[j] = arr[j + 1];
//				arr[j + 1] = temp;
//				flag = 0;
//			}
//		}
//		if (flag == 1)
//		{
//			break;
//		}
//	}
//}
//int main()
//{
//	int arr[] = {9,8,7,6,5,4,3,2,1,0};
//	int sz = sizeof(arr) / sizeof(arr[0]);
//	bubble_sort(arr,sz);
//	int i = 0;
//	for (i = 0;i < sz;i++ )
//	{
//		printf("%d ",arr[i]);
//	}
//	return 0;
//}

一、使用回调函数,模拟实现qsort:

#include<stdlib.h>
//qsort能应用于任何类型的比较
/*void qsort(void* base, size_t num, size_t size,int (*compar)(const void*, const void*));*///起始地址,个数,每个元素大小,比较元素


int cmp_int(const void* e1,const void* e2)
{
	return *((int*)e1) - *((int*)e2);
}

struct Stu
{
	char Name[20];
	int age;

};

int cmp_by_name(const void* e1,const void* e2)
{
	return strcmp(((struct Stu*)e1)->Name, ((struct Stu*)e2)->Name);
}


int cmp_by_age(const void* e1, const void* e2)
{
	return (((struct Stu*)e1)->age - ((struct Stu*)e2)->age);
}


void test1()
{
	int arr[] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, 4, cmp_int);
	print(arr, sz);
}

void test2()
{
	struct Stu s[3] = { {"张三",30},{"李四",40},{"王五",50} };
	int sz = sizeof(s) / sizeof(s[0]);
	int i = 0;

	///按照名字来比较
	qsort(s,sz,sizeof(s[0]),cmp_by_name);
	for (i = 0; i < 3; i++)
	{
		printf("%s\n", s[i].Name);
	}


	//按照年龄比较
	qsort(s, sz, sizeof(s[0]), cmp_by_age);
	
	for (i = 0; i < 3; i++)
	{
		printf("%d\n", s[i].age);
	}
}

int main()
{
	test1();
	test2();
	return 0;
}

 二、使用回调函,模拟实现qsort(采用冒泡的方式)

int cmp_int(const void* e1,const void* e2)
{
	return *((int*)e1) - *((int*)e2);
}


struct Stu
{
	char Name[20];
	int age;

};

int cmp_by_name(const void* e1,const void* e2)
{
	return strcmp(((struct Stu*)e1)->Name, ((struct Stu*)e2)->Name);
}

int cmp_by_age(const void* e1, const void* e2)
{
	return (((struct Stu*)e1)->age - ((struct Stu*)e2)->age);
}



void Swap(char* a,char* b,size_t width)
{
	size_t i = 0;
	for (i = 0;i < width;i++)
	{
		char temp = *a;//每次访问一个字节
		*a = *b;
		*b = temp;
		a++;
		b++;
	}
}


void bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* e1,const void* e2))  //定义函数指针,e1.e2可以不写
{
	
	 size_t  i = 0;

	for (i = 0;i < sz - 1;i++)//趟数,10个元素应该进行9趟,最后一个元素,不需要排序
	{
		//每趟交换  第一趟进行9次交换
		size_t j = 0;
		for (j = 0; j< sz -1 - i ;j++)
		{
			if (cmp((char*)base+ j*width,(char*)base+(j+1)*width)>0)//因为不知道传过来的是多大,所以用最小的char,每次跳过1个字节
			{
				//交换
				Swap((char*)base + j * width, (char*)base + (j + 1) * width,width);
			}
		}
	
	}
}
void print(int* arr, int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d ", arr[i]);
	}
}



//测试自定义的Bubblesort()排序结构体
void test2()
{
	struct Stu s[3] = { {"张三",30},{"李四",40},{"王五",50} };
	int sz = sizeof(s) / sizeof(s[0]);
	int i = 0;

	///按照名字来比较
	bubble_sort(s, sz, sizeof(s[0]), cmp_by_name);
	for (i = 0; i < 3; i++)
	{
		printf("%s\n", s[i].Name);
	}


	//按照年龄比较
	bubble_sort(s, sz, sizeof(s[0]), cmp_by_age);
	for (i = 0; i < 3; i++)
	{
		printf("%d\n", s[i].age);
	}
}

 
//测试自定义的Bubblesort();
void test3()
{
	int arr[] = {9,8,7,6,5,4,3,2,1,0};
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr,sz,sizeof(arr[0]),cmp_int);
	print(arr,sz);
}


int main()
{
	test2();//自定义测试结构体的比较
	/*test3();*///自定义bubblesort测试
	return 0;
}

 打印:

三、 指针和数组笔试题解析

 

 以上为指针3的知识点整理,如有误,请在评论区多多评论😄

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值