首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >C语言初阶---指针(5)

C语言初阶---指针(5)

作者头像
胖咕噜的稞达鸭
发布2025-10-22 14:42:36
发布2025-10-22 14:42:36
1230
举报
文章被收录于专栏:C++初阶高阶C++初阶高阶

https://blog.csdn.net/asciiletters/article/details/147064833?fromshare=blogdetail&sharetype=blogdetail&sharerId=147064833&sharerefer=PC&sharesource=asciiletters&sharefrom=from_link

本文承接C语言初阶---指针(4),上文有链接,文章仅为作者个人学习感悟,有不当之处,恳请指正。

15.回调函数

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

代码语言:javascript
复制
#include<stdio.h>

int Add(int a, int b)
{
	return a+b;
}
int Sub(int a, int b)
{
	return a - b;
}
int Mul(int a, int b)
{
	return a * b;
}
int Div(int a, int b)
{
	return a / b;
}
void calc(int (*pf)(int, int))
{
	int x, y; 
	int z = 0;
	printf("请输入两个操作数:");
	scanf("%d %d", &x, &y);
	z = pf(x, y);
	printf("%d\n", z);
}
int main(void)
{
	int input =1;
	do
	{
		printf("*********************\n");
		printf("***  1.Add 2.Sub  ***\n");
		printf("***  3.Mul 4.Div  ***\n");
		printf("***  0.exit  ********\n");
		printf("*********************\n");
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			calc(Add);
			break;
		case 2:
			calc(Sub);
			break;
		case 3:
			calc(Mul);
			break;
		case 4:
			calc(Div);
			break;
		case 5:
			printf("退出计算器\n");
			break;
		default:
			printf("请重新输入:\n");
			break;
		}
	} while (input);
	return 0;
}

16.qsort函数

用来排序的,库函数,直接用来排序数据,底层使用的是快速排序的方式。

之前为了实现排序,我们用冒泡排序的方式,这里我们再次回顾一下。

代码语言:javascript
复制
#include<stdio.h>

void BubbleSort(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			if (arr[j] > arr[j + 1])
			{
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}
void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d", i);
	}
	printf("\n");
}
int main(void)
{
	int arr[10] = { 9,8,7,6,5,4,3,2,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	BubbleSort(arr, sz);
	print_arr(arr, sz);
	return 0;
}

用冒泡排序实现升序,排序的数字只能是整型数字,那如果是浮点型的呢 ?这里我们就可以用qsort函数来实现任意类型的数据。

两个数字可以使用大于号进行比较,但是对于两个字符串,两个结构体元素是不可以用大于号进行比较的。

下面使用qsort排序整型数据 。

代码语言:javascript
复制
#include<stdio.h>
#include<stdlib.h>
//void* 类型的指针是无具体类型的指针,这种类型的指针不能直接解引用,也不能进行+-整数 的运算

int cmp_int(const void* p1, const void* p2)
{
	if (*(int*)p1 > *(int*)p2)//把p1,p2的地址强制类型转换为int类型
		return 1;
	else if (*(int*)p1 == *(int*)p2)
		return 0;
	else(*(int*)p1 < *(int*)p2);
		return -1;
}
void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d", arr[i]);
	}
	printf("\n");
}
void test1()
{
	int arr[10] = { 3,2,4,7,8,5,0,6,9,1 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_int);
	print_arr(arr, sz);
}
int main(void)
{
	test1();
	return 0;
}
这一部分也可以降序,写成 return *(int *)p2  -  *(int *)p1  ;
这一部分也可以降序,写成 return *(int *)p2 - *(int *)p1 ;

上图也可以排成降序,写成 return *(int *)p2 - *(int *)p1;

这里写一段代码使用qsort排序结构体的数据。//按名字 字符串长度来排序。

代码语言:javascript
复制
//写一段代码使用qsort排序结构体的数据
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//void* 类型的指针是无具体类型的指针,这种类型的指针不能直接解引用,也不能进行+-整数 的运算
struct stu
{
	char name[20];
	int age;
};

//这里的两个结构体元素怎么比较大小?
//1.按照名字--字符串比较
int cmp_stu_by_name(const void* p1, const void* p2)
{
	return strcmp(((struct stu*)p1)->name, ((struct stu*)p2)->name);
}
void test2()
{
	struct stu arr[3] = { {"zhangsan",20},{"lisi",35},{"wangwu",18} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_name);
}
int main(void)
{
	test2();
	return 0;
}

//要访问得到的是结构体变量,要访问其指向对象的成员,用->,如果得到的是结构体变量,想访问它的成员,就用.

如果要排序,按照名字字符串长度来排序,代码调试过程中可以看到,lisi被排在了第一位,wangwu次之,zhangsan最大。

代码语言:javascript
复制
//写一段代码使用qsort排序结构体的数据
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//void* 类型的指针是无具体类型的指针,这种类型的指针不能直接解引用,也不能进行+-整数 的运算
struct stu
{
	char name[20];
	int age;
};

//这里的两个结构体元素怎么比较大小?
//2.按照年龄--整型比较
int cmp_stu_by_age(const void* p1, const void* p2)
{
	return (((struct stu*)p1)->age  -   ((struct stu*)p2)->age);
}
void test2()
{
	struct stu arr[3] = { {"zhangsan",20},{"lisi",35},{"wangwu",18} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	qsort(arr, sz, sizeof(arr[0]), cmp_stu_by_age);
}
int main(void)
{
	test2();
	return 0;
}

如果按照年龄(整型)排序,代码调试过程中,wangwu排在了第一位,zhangsan是第二位,lisi最后一位。

我们模仿qsort来实现一个冒泡排序。

代码语言:javascript
复制
//写一段代码使用qsort排序结构体的数据
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int cmp_int(const void* p1, const void* p2)
{
	return *(int*)p1 - *(int*)p2;
}

void print_arr(int arr[], int sz)
{
	int i = 0;
	for (i = 0; i < sz; i++)
	{
		printf("%d", arr[i]);
	}
	printf("\n");
}

void Swap(char* buf1, char* buf2, size_t width)
{
	char tmp = *buf1;
	*buf1 = *buf2;
	*buf2 = tmp;
	buf1++; buf2++;
}
void bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* p1, const void* p2))
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			//arr[j] > arr[j + 1]
			if (cmp((char*)base+j*width, (char*)base+(j+1)*width) > 0)
			{
				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
			}
		}
	}
}
void test3()
{
	int arr[] = { 3,2,4,5,8,9,6,7,1,0 };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz, sizeof(arr[0]), cmp_int);
	print_arr(arr, sz);
}
int main(void)
{
	test3();
	return 0;
}
//打印出来是0123456789
代码语言:javascript
复制
//写一段代码使用bubble_sort排序结构体的数据
#include<stdio.h>
#include<stdlib.h>
#include<string.h>

struct stu
{
	char name[20];
	int age;
};

int cmp_stu_by_age(const void* p1, const void* p2)
{
	return (((struct stu*)p1)->age  -   ((struct stu*)p2)->age);
}
//int cmp_stu_by_name(const void* p1, const void* p2)
//{
//	return (((struct stu*)p1)->name - ((struct stu*)p2)->name);
//}

void Swap(char* buf1, char* buf2, size_t width)
{
	char tmp = *buf1;
	*buf1 = *buf2;
	*buf2 = tmp;
	buf1++; buf2++;
}
void bubble_sort(void* base, size_t sz, size_t width, int (*cmp)(const void* p1, const void* p2))
{
	int i = 0;
	for (i = 0; i < sz - 1; i++)
	{
		int j = 0;
		for (j = 0; j < sz - 1 - i; j++)
		{
			//arr[j] > arr[j + 1]
			if (cmp((char*)base+j*width, (char*)base+(j+1)*width) > 0)
			{
				Swap((char*)base + j * width, (char*)base + (j + 1) * width, width);
			}
		}
	}
}

void test4()
{
	struct stu arr[3] = { {"zhangsan",20},{"lisi",35},{"wangwu",18} };
	int sz = sizeof(arr) / sizeof(arr[0]);
	bubble_sort(arr, sz, sizeof(arr[0]), cmp_stu_by_age);
	//bubble_sort(arr, sz, sizeof(arr[0]), cmp_stu_by_name);
}
int main(void)
{
	test4();
	return 0;
}

以上代码要经过调试,才能看到结果,因为没有打印。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 15.回调函数
  • 16.qsort函数
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档