初识指针(5)<C语言>
前言
在前几篇文章中,已经介绍了指针一些基本概念、用途和一些不同类型的指针,下文将介绍某些指针类型的运用。本文主要介绍函数指针数组、转移表(函数指针的用途)、回调函数、qsort使用举例等。
函数指针数组
函数指针数组即每个元素都是函数地址的数组。
//函数指针数组 int jia(int x, int y) {//加法函数 return x + y; } int jian(int x, int y) {//减法函数 return x - y; } int cheng(int x, int y) {//乘法函数 return x * y; } int chu(int x, int y) {//除法函数 return x / y; } int main() { int (*p[4]) (int, int) = {jia,jian,cheng,chu}; //保证p与[]先结合成数组,之后再与*结合,构成指针数组,最后再和函数结合 return 0; }
转移表(函数指针的用途)
假如我们写个程序完成对两个数之间的简单数学运算(加减乘除),按照正常的写法,选择一种计算后进入判断环节,之后再输入数字,这样写每一种运算下都会有代码重复,有没有办法简化代码呢?
回调函数
即一个通过函数指针调用的函数。
通过回调函数,可以消除特定场景中因为多分支造成的重复代码,例如:一个实现加减乘除的程序中,每个分支下都有一种运算,每个运算可写成一个函数,我们可以再写一个函数将每种分支下的重复代码包含进去,通过传入函数指针来调用运算函数,从而完成运算。
//回调函数 int jia(int x, int y) { return x + y; } int jian(int x, int y) { return x - y; } int cheng(int x, int y) { return x * y; } int chu(int x, int y) { return x / y; } void menu() { printf("**********************\n"); printf("***1.加法 2.减法****\n"); printf("***3.乘法 4.除法****\n"); printf("*** 0.exit ****\n"); printf("**********************\n"); } int hui(int(*p)(int, int)) { int x, y; printf("请输入操作数\n"); scanf("%d%d", &x, &y); return p(x, y); } int main() { int i, x, y,ret; do { menu(); printf("请选择—>"); scanf("%d", &i); switch (i) { case 1: ret = hui(jia); printf("%d\n", ret); break; case 2: ret = hui(jian); printf("%d\n", ret); break; case 3: ret = hui(cheng); printf("%d\n", ret); break; case 4: ret = hui(chu); printf("%d\n", ret); break; case 0: printf("退出计算\n"); break; default: printf("输入错误,重新输入\n"); break; } } while (i); return 0; }
qsort使用举例
qsort函数是C语言的库函数,包含在头文件中,它可用于对所有数据类型进行排序,包括结构体,使用这个库函数,必须再写个比较元素的函数,返回int型(大于0:大于、等于0:等于、小于0:小于),默认升序,如要进行逆序输出,则在比较函数中,交换操作数的位置。
排序整型数组
//qsort函数,排序整型数组 #include #include int intcmp (const void* p1, const void* p2) {//比较函数,两个元素的比较 return (*(int*)p1) - (*(int*)p2); } int main() { int arr[6] = { 3,6,2,0,3,8 }; int sz = sizeof(arr) / sizeof(arr[1]); qsort(arr,//数据类型void*base,用于接受待排序的数组的数组名,也就是首元素的地址 sz,//数据类型sizeof_t,待排序数组的元素个数 sizeof(arr[0]),//数据类型sizeof_t,待排序数组元素字节大小 intcmp); //数据类型 int(*) (const void*,const void*),用于接收俩个元素比较的函数, //返回值:大于0(表示大于),等于0(等于),小于0(小于) for (int i = 0; i运行结果:
排序结构体
按字符排
//qsort函数,结构体 #include #include #include struct stu { char name[100]; int age; int height; }; int namecmp(const void* p1, const void* p2) {//按名称排 return strcmp((*(struct stu*)p1).name, (*(struct stu*)p2).name); } int main() { struct stu arr[] = { {"zk",18,163},{"tian",19,180},{"xing",17,170} }; int sz = sizeof(arr) / sizeof(arr[1]); qsort(arr,sz,sizeof(arr[0]),namecmp); for (int i = 0; i运行结果
按照整形排
//qsort函数,结构体 #include #include #include struct stu { char name[100]; int age; int height; }; //int namecmp(const void* p1, const void* p2) {//按名称排 // return strcmp((*(struct stu*)p1).name, (*(struct stu*)p2).name); //} int agecmp(const void* p1, const void* p2) {//按照年龄排 return (*(struct stu*)p1).age - (*(struct stu*)p2).age; } int main() { struct stu arr[] = { {"zk",18,163},{"tian",19,180},{"xing",17,170} }; int sz = sizeof(arr) / sizeof(arr[1]); qsort(arr,sz,sizeof(arr[0]),agecmp); for (int i = 0; i运行结果
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理!
部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理!
图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!