C语言根本知识------指针(4)

[复制链接]
发表于 2025-10-25 18:20:23 | 显示全部楼层 |阅读模式
1. 回调函数是什么?

  回调函数就是⼀个通过函数指针调用的函数。
假如你把函数的指针(所在)作为参数通报给另⼀个函数,当这个指针被⽤来调⽤其所指向的函数 时,被调⽤的函数就是回调函数。
  1. void qsort(void base,//指针,指向第一个待排序数组的第一个元素
  2.            size_t num,//是base指向排序数组的元素个数,
  3.            size_t size,//base指向的待排序数组元素的大小
  4.            int (*copare)(cosnt void *cosnt void *,) ;//函数指针---指向的就是两个元素的比较函数
  5. 实现这个函数如下面代码
  6. #include <stdio.h>
  7. #include <tdilib.h>
  8. void parr(int arr[], int sz)
  9. {
  10.     for (int i = 0;i < sz;i++)
  11.     {
  12.        primntf("%d ",arr[i]);
  13.     }
  14. }
  15. int cmpm_it(const void *p1,const void *p2)
  16. {
  17.    return *(int*)p1-*(int*)p2;
  18. }
  19. int main()
  20. {
  21.     int arr[] = {9,5,2,4,6,4,8,1};
  22.     int sz=sizeof(arr) / sizeof(arr[0]);
  23.     qsort(arr,sz,sizof(arr[0],cmpm_it);
  24.     parr(arr,sz);
  25.     return 0;
  26. }
复制代码
2.qsort排序结构体/整型数据:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. struct stu
  4. {
  5.     char name[20];
  6.     int age;
  7. };
  8. void parr(int arr[], int sz)
  9. {
  10.     for (int i = 0;i < sz;i++)
  11.     {
  12.         primntf("%d ", arr[i]);
  13.     }
  14. }
  15. //结构体大小用名字大小比较
  16. int cmpm_it_name(const void* p1, const void* p2)
  17. {
  18.     return strcmp(((struct stu*)p1)->name,((struct stu*)p2)->name);
  19. }
  20. //结构体大小用年龄大小比较
  21. int cmpm_it_name(const void* p1, const void* p2)
  22. {
  23.     return (((struct stu*)p1)->age, ((struct stu*)p2)->age);
  24. }
  25. int main()
  26. {
  27.     struct stu arr[] = {"zhansn",15,"李四",16};
  28.     int sz = sizoef(arr) / sizeof(arr[0]);
  29.     qsort(arr, sz, sizof(arr[0]), cmpm_it_name);
  30.     parr(arr, sz);
  31.     return 0;
  32. }
复制代码
3.模拟qsort实现:
  1. #include<stdio.h>
  2. int int_cmp(const void * p1, const void * p2)
  3. {
  4. return (*( int *)p1 - *(int *) p2);
  5. }
  6. void _swap(void *p1, void * p2, int size)
  7. {
  8. int i = 0;
  9. for (i = 0; i< size; i++)
  10. {
  11. char tmp = *((char *)p1 + i);
  12. *(( char *)p1 + i) = *((char *) p2 + i);
  13. *(( char *)p2 + i) = tmp;
  14. }
  15. }
  16. void bubble(void *base,//指向第一个元素指针
  17. int count , //元素个数
  18. int size,//一个元素大小个数
  19. int(*cmp )(void *, void *))//两个元素比较函数
  20. {
  21.   int i = 0;
  22.   int j = 0;
  23. for (i = 0; i< count - 1; i++)
  24. {
  25. for (j = 0; j<count-i-1; j++)
  26. {
  27.   if (cmp ((char *) base + j*size , (char *)base + (j + 1)*size) > 0)
  28. {
  29.   _swap(( char *)base + j*size, (char *)base + (j + 1)*size, size);
  30. }
  31. }
  32. }
  33. }
  34. int main()
  35. {
  36.   int arr[] = { 1, 3, 5, 7, 9, 2, 4, 6, 8, 0 };
  37.   int i = 0;
  38.   bubble(arr, sizeof(arr) / sizeof(arr[0]), sizeof (int), int_cmp);
  39. for (i = 0; i< sizeof(arr) / sizeof(arr[0]); i++)
  40. {
  41.   printf( "%d ", arr[i]);
  42. }
  43.   printf("\n");
  44.   return 0;
  45. }
复制代码
4.sizeof和strlen

1.1 sizeof

我们学习了 sizeof , sizeof 盘算变量所占内存内存空间⼤⼩的,单位是 字节,假如使用数是范例的话,盘算的是使⽤范例创建的变量所占内存空间的⼤⼩。
sizeof 只关注占⽤内存空间的⼤⼩,不在乎内存中存放什么数据。
  1. #inculde <stdio.h>
  2. int main()
  3. {
  4.   int a = 10;
  5.   printf("%d\n", sizeof(a));
  6.   printf("%d\n", sizeof a);
  7.   printf("%d\n", sizeof(int));
  8.   return 0;
  9. }
复制代码
1.2 strlen

strlen 是C语⾔库函数,功能是求字符串⻓度。函数原型如下:
  1. 1 size_t strlen ( const char * str );
复制代码
统计的是从 strlen 函数的参数 str 中这个所在开始向后, \0 之前字符串中字符的个数。 strlen 函数会⼀直向后找 \0 字符,直到找到为⽌,以是大概存在越界查找。1.3 sizeof 和 strlen的对比


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表