深入理解指针(5)学习笔记

📅 2026/8/15 10:36:59
深入理解指针(5)学习笔记
一、回调函数回调函数是指通过函数的指针被调用的函数。可以通过这种方式起到简化代码的目的。继续用上一篇笔记中提到的简易计算器举例voidcalc(int(*pf)(intx,inty)){......}......intmain(){......calc(add1);//函数名就是函数地址这里将函数地址的参数传给calcadd1就被称为回调函数}二、qsort函数用于排序整型、浮点型1.认识qsort之前利用冒泡排序对整型变量进行过排序但是这种方法不适用于浮点型变量需要使用qsort函数。qsort函数需要的参数首元素地址函数名、元素个数、每个元素宽度、函数指针指针指向的函数在排序的时候用来比较两个数据的大小关系。需要注意参数四函数中对于比较的两个数a、b如果ab,返回一个大于零的数ab,返回小于零的数ab返回零。使用时要包含头文件“#include stdlib.h”。下面是对整型变量的排序#defineCRT_SECURE_NO_WARNINGS#includestdio.h#includestdlib.hintint_compare(constvoid*p1,constvoid*p2){return(*((int*)p1)-*((int*)p2));}intmain(){intarr[]{2,3,6,8,1,9,10};inti0;intnumsizeof(arr)/sizeof(arr[0]);intsizesizeof(arr[0]);for(i0;inum;i){printf(%d ,arr[i]);}printf(\n);qsort(arr,num,size,int_compare);for(i0;inum;i){printf(%d ,arr[i]);}return0;}下面是对浮点型变量的排序intdouble_compare(constvoid*p1,constvoid*p2){//return(*((double*)p1) - *((double*)p2));注意不要这样写这样会存在double类型向int类型的转换//类型转换的时候会直接丢掉小数点后所有比如-0.7被当成0判断两数相等。doublea*((double*)p1);doubleb*((double*)p2);if(ab)return1;elseif(ab)return-1;elsereturn0;}intmain(){doublearr[]{2.3,3,6.1,8,1,9,10};inti0;intnumsizeof(arr)/sizeof(arr[0]);intsizesizeof(arr[0]);for(i0;inum;i){printf(%.1f ,arr[i]);}printf(\n);qsort(arr,num,size,double_compare);for(i0;inum;i){printf(%.1f ,arr[i]);}return0;}中间标注了一处明显区别需要注意容易出错的根源在于double类型向int类型转换时的数据丢失。三、qsort函数用于排序结构体数据首先补充结构体成员访问操作符相关1、变量名.成员 2、变量指针-成员下面是用年龄和姓名两种方式排序结构体数据的代码structstu{charname[30];//注意储存的大小intage;};intcom_age(constvoid*p1,constvoid*p2){return(((structstu*)p1)-age-((structstu*)p2)-age);}intcom_name(constvoid*p1,constvoid*p2){returnstrcmp(((structstu*)p1)-name,((structstu*)p2)-name);}voidtest1()//无参数无返回值{structstus[]{{zhangsan,18},{wangwu,17},{lisi,20}};intnumsizeof(s)/sizeof(s[0]);intsizesizeof(s[0]);qsort(s,num,size,com_age);inti0;for(i0;inum;i){printf(%s %d ,s[i].name,s[i].age);}printf(\n);}voidtest2(){structstus[]{{zhangsan,18},{wangwu,17},{lisi,20}};intnumsizeof(s)/sizeof(s[0]);intsizesizeof(s[0]);qsort(s,num,size,com_name);inti0;for(i0;inum;i){printf(%s %d ,s[i].name,s[i].age);}printf(\n);}intmain(){test1();//用年龄来排序test2();//用姓名来排序return0;}