C语言指针(下)

张开发
2026/4/13 9:15:43 15 分钟阅读

分享文章

C语言指针(下)
系列文章目录文章目录系列文章目录前言一、回调函数二、qsort函数三、sizeof和strlen的对比总结前言本文是C语言指针的最后一篇。提示以下是本篇文章正文内容下面案例可供参考一、回调函数回调函数就是一个通过函数指针调用的函数。如果把函数的指针作为参数传递给另一个函数这个指针被用来指向所调用的那个函数就是回调函数回调函数不是由函数的实现方直接调用的而是通过特定的时间或者条件发生的时候由另一发进行调用用于对事件或者条件进行响应用上文C语言指针中最后实现的那个计算器举例voidcalc(int(*pf)(int,int)){intret0;intx,y;scanf(%d %d,x,y);retpf(x,y);printf(%d,ret);}我们可以直接通过函数直接调用帮我们少写很多代码。calc(add);二、qsort函数qsort是一个能帮助我们实现排序的函数但是在使用之前我们需要实现一个比较函数。#includestdio.hintint_cmp(constvoid*p1,constvoid*p2){return(*(int*)p1-*(int*)p2);}intmain(){inta[]{1,2,5,7,2,4,6,8,0};intszsizeof(a)/sizeof(a[0]);inti0;qsort(a,sz,sizeof(int),int_cmp);for(i0;isz;i){printf(%d,a[i]);}printf(\n);return0;}使用回调函数模拟实现qsort#includestdio.hintint_cmp(constvoid*p1,constvoid*p2){return(*(int*)p1-*(int*)p2);}voidswap(void*p1,void*p2,intsize){inti0;for(i0;isize;i){chartmp*((char*)p1i);*((char*)p1i)*((char*)p2i);*((char*)p2i)tmp;}}voidbubble(void*base,intcount,intsize,int(*cmp)(void*,void*)){inti0;intj0;for(i0;icount-1;i){for(j0;jcount-i-1;j){if(cmp((char*)basej*size,(char*)base(j1)*size)0){swap((char*)basej*size,(cahr*)base(j1)*size,size);}}}}intmain(){intarr[]{1,3,5,7,9,2,4,6,8,0};inti0;bubble(arr,sizeof(arr)/sizeof(a[0]),sizeof(int),int_cmp);for(i0;isizeof(arr)/sizeof(a[0]);i){printf(%d ,arr[i]);}printf(\n);return0;}三、sizeof和strlen的对比sizeof计算变量所占内存内存空间大小单位是字节如果操作数是类型则计算使用该类型创建变量所占的内存空间的大小。strlen是C语言库函数使用的时候要包含头文件string.h,功能是求字符串的长度。统计的是从strlen函数的参数str中这个地址开始向后\0之前字符串中字符的个数。strlen函数会一直向后找\0字符直到找到位置因此会存在越界行为。总结以上就是C语言指针下的内容希望能对大家有所帮助。

更多文章