「2」指针进阶——详解
创始人
2024-05-26 22:00:47
0
🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀 

目录

🐰指向函数指针数组的指针(很少用,了解)

🐰回调函数(通过函数指针调用函数)

🐰快速排序

🌸冒泡排序

🌸qsort()

🐰用冒泡排序类似实现qsort


🐰指向函数指针数组的指针(很少用,了解)

#include
void Add(int ,int)
{printf("%d\n",1+1);
}
void Sub(int ,int)
{printf("%d\n",1-1);
}
int main()
{int (*pf)(int,int)=Add;//函数指针int (*pfArr[4])(int,int)={Add,Sub};//函数指针数组int (*(*ppfArr)[4])(int,int)=&pfArr;//ppfArr就是指向函数的指针数组的指针return 0;
}

🐰回调函数(通过函数指针调用函数)

通过回调函数实现 两个操作数的加减乘除:
#include
void Calc(int(*pf)(int,int))
{int x=0,y=0;printf("请输入两个操作数\n");scanf("%d %d",&x,&y);int ret=pf(x,y);printf("%d\n",ret);
}
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(void)
{printf("****    两位数的计算器     ****\n");printf("****    1.Add   2.Sub   ****\n");printf("****    3.Mul   4.Div   ****\n");printf("****    0.exit          ****\n");
}
int main()
{int input=0;do{menu();printf("请选择\n");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 0:printf("exit\n");break;default:printf("输入错误\n");}}while(input);
}

🐰快速排序

qsort是一个库函数,是用来排序(使用的快速排序的方法) 1.库函数里的,可以直接使用        2.可以排序任意类型的数据

🌸冒泡排序

在这里插入图片描述

 #includevoid Bubble(int arr[],int len)
{int i=0,j=0;for(i=0;iarr[j+1]){int temp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}}
}
void Print(int arr[],int len)
{for(int i=0;i

🌸qsort()

qsort的原型:void qsort (void* base, size_t num, size_t size,int (*compar)(const void*,const void*));
void qsort (void* base//指向了待排序数组的第一个元素的地址, size_t num(无符号整形)//待排序的元素个数, size_t size(无符号整形)//每个元素的大小,单位是字节,int (*compar)(const void*,const void*)//这里是一个函数指针,指向一个函数,这个函数可以比较2个元素的大小);
比较函数:就是函数指针campar指向的函数,因为使用qsort时,要自己定义比较函数,以下是常见的比较函数
比较整形变量时
int cmp_int(const void* e1, const void* e2)
{return *(int*)e1 - *(int*)e2;
}
比较浮点型变量时
int cmp_float(const void* e1, const void* e2)
{return (int)(*(float*)e1 - *(float*)e2);
}
比较字符串变量时
int cmp_str_size(const void* e1, const void* e2)
{return strcmp((char*)e1,(char*)e2);
}
比较字符串长度时
int cmp_str_len(const void* e1, const void* e2)
{return strlen((char*)e1)-strlen((char*)e2);
}
比较结构体变量时
int cmp_by_age(const void*e1, const void*e2)
{return (int)((stu*)e1)->weight - ((stu*)e2)->weight));
}

cmp函数的返回值:返回值<0(不进行置换),>0(进行置换),0(不进行置换)。记得返回的结果一定是整形的,如果不是需要强制转为整形的

‼️注:void*的指针不能解引用,也不能算术运算 下面是使用qsort排序整形变量和结构体变量的原码:
#include
#include
#include
int cmp_int(const void* e1,const void* e2)//对整形比较
{return *(int*)e1-*(int*)e2;
}void test_1()
{int arr[]={2,3,4,5,6,7,1};int sz=sizeof(arr)/sizeof(arr[0]);//计算出数组下标,就不用手动去数有多少个元素了//这里需要提供一个比较函数,这个比较函数能够比较2个整数的大小//qsort默认为升序qsort(arr,sz,sizeof(arr[0]),cmp_int);for(int i=0;iname,((struct stu*)e2)->name);
}int sort_by_age(const void* e1,const void* e2)//对整形的比较
{return ((struct stu*)e1)->age-((struct stu*)e2)->age;
}int sort_by_weight(const void* e1,const void* e2)//对浮点型比较
{return ((struct stu*)e1)->weight-((struct stu*)e2)->weight;
}
void test_2()//对结构体进行排序
{struct stu s[3]={{"zhangsan",23,65.5},{"lisi",27,56.5},{"wangwu",24,64}};int sz=sizeof(s)/sizeof(s[0]);qsort(s, sz, sizeof(s[0]), sort_by_name);//对名字排序for(int i=0;i

🐰用冒泡排序类似实现qsort

 qsort()的底层是快速排序,但是没有学过快速排序,可以使用冒泡排序来代替
#include
void swap(char* buf1,char*buf2,int width)
//为什么不直接进行交换,而是交换每个字节的内容?这是因为这交换的不只是整形变量,这里还可以交换其它类型的变量{for(int i=0;i0)//为什么将base强制转化为(char*)呢?假如比较的是整形变量,我们将base转化为(char*),加上width(就是这里的整形变量的大小,4字节)就可以找到下个元素的地址,{//交换swap((char*)base+j*width,(char*)base+(j+1)*width,width);//然后把这个变量的地址传给交换函数}}}
}
int cmp_int(const void* e1,const void* e2)//对整形比较
{return *(int*)e1-*(int*)e2;
}
int main()
{int arr[10]={2,3,4,5,6,7,1,9,13,10};int sz=sizeof(arr)/sizeof(arr[0]);buble_sort(arr,sz,sizeof(arr[0]),cmp_int);for(int i=0;i

 🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸

相关内容

热门资讯

安卓系统能跑win吗,探索跨平... 你有没有想过,你的安卓手机里能不能装上Windows系统呢?这听起来是不是有点像科幻电影里的情节?别...
安卓车载系统蓝牙设置,畅享智能... 你有没有发现,现在开车的时候,手机和车载系统之间的互动越来越频繁了呢?这不,今天就来给你详细说说安卓...
奥利奥安卓系统,探索新一代智能... 你有没有想过,一块小小的奥利奥饼干竟然能和强大的安卓系统扯上关系?没错,今天就要来聊聊这个跨界组合,...
微信使用安卓系统,功能解析与操... 你有没有发现,现在用微信的人越来越多了呢?尤其是安卓系统的用户,简直就像潮水一样涌来。今天,就让我带...
体验最新原生安卓系统,极致体验... 你有没有想过,手机系统就像是我们生活的调味品,有时候换一种口味,生活都会变得有趣起来呢?最近,我体验...
安卓系统能玩原神,尽享奇幻冒险... 你有没有想过,在安卓系统上也能畅玩《原神》这样的热门游戏呢?没错,就是那个画面精美、角色丰富、玩法多...
安卓写手机银行系统,基于安卓平... 你有没有想过,手机银行系统在我们日常生活中扮演了多么重要的角色呢?每天刷刷手机,就能轻松管理账户,转...
僵尸之夜恐怖安卓系统,揭秘恐怖... 僵尸之夜,恐怖安卓系统来袭!想象一个寂静的夜晚,你正沉浸在美梦中,突然,一阵诡异的铃声打破了夜的宁静...
谷歌框架和安卓系统,构建智能移... 你有没有想过,为什么你的手机那么聪明,能帮你找到路线,还能帮你拍出美美的照片呢?这都要归功于一个超级...
安卓系统和oppo系统哪个流畅... 你有没有想过,手机系统哪个更流畅呢?安卓系统和OPPO系统,这两个名字听起来就让人心动。今天,咱们就...
安卓怎么用微软系统,利用微软系... 你是不是也和我一样,对安卓手机上的微软系统充满了好奇?想象那熟悉的Windows界面在你的安卓手机上...
安卓系统如何安装nfc,安卓系... 你有没有想过,用手机刷公交卡、支付账单,是不是比掏出钱包来得酷炫多了?这就得归功于NFC技术啦!今天...
ios系统可以转安卓,跨平台应... 你有没有想过,你的iPhone手机里的那些宝贝应用,能不能搬到安卓手机上继续使用呢?没错,今天就要来...
iOSapp移植到安卓系统,i... 你有没有想过,那些在iOS上让你爱不释手的app,是不是也能在安卓系统上大放异彩呢?今天,就让我带你...
现在安卓随便换系统,探索个性化... 你知道吗?现在安卓手机换系统简直就像换衣服一样简单!没错,就是那种随时随地、随心所欲的感觉。今天,就...
安卓系统安装按钮灰色,探究原因... 最近发现了一个让人头疼的小问题,那就是安卓手机的安装按钮突然变成了灰色,这可真是让人摸不着头脑。你知...
安卓7.1.1操作系统,系统特... 你知道吗?最近我在手机上发现了一个超级酷的新玩意儿——安卓7.1.1操作系统!这可不是什么小打小闹的...
安卓os系统怎么设置,并使用`... 你有没有发现,你的安卓手机有时候就像一个不听话的小孩子,有时候设置起来真是让人头疼呢?别急,今天就来...
安卓降低系统版本5.1,探索安... 你知道吗?最近安卓系统又来了一次大动作,竟然把系统版本给降到了5.1!这可真是让人有点摸不着头脑,不...
解放安卓系统被保护,解放安卓系... 你有没有想过,你的安卓手机其实可以更加自由地呼吸呢?是的,你没听错,我说的就是解放安卓系统被保护的束...