当前位置:   article > 正文

初识指针(5)<C语言>

初识指针(5)<C语言>

前言

        在前几篇文章中,已经介绍了指针一些基本概念、用途和一些不同类型的指针,下文将介绍某些指针类型的运用。本文主要介绍函数指针数组、转移表(函数指针的用途)、回调函数、qsort使用举例等。


函数指针数组

        函数指针数组即每个元素都是函数地址的数组。

  1. //函数指针数组
  2. int jia(int x, int y) {//加法函数
  3. return x + y;
  4. }
  5. int jian(int x, int y) {//减法函数
  6. return x - y;
  7. }
  8. int cheng(int x, int y) {//乘法函数
  9. return x * y;
  10. }
  11. int chu(int x, int y) {//除法函数
  12. return x / y;
  13. }
  14. int main() {
  15. int (*p[4]) (int, int) = {jia,jian,cheng,chu};
  16. //保证p与[]先结合成数组,之后再与*结合,构成指针数组,最后再和函数结合
  17. return 0;
  18. }

 转移表(函数指针的用途)

        假如我们写个程序完成对两个数之间的简单数学运算(加减乘除),按照正常的写法,选择一种计算后进入判断环节,之后再输入数字,这样写每一种运算下都会有代码重复,有没有办法简化代码呢?


回调函数

        即一个通过函数指针调用的函数。

        通过回调函数,可以消除特定场景中因为多分支造成的重复代码,例如:一个实现加减乘除的程序中,每个分支下都有一种运算,每个运算可写成一个函数,我们可以再写一个函数将每种分支下的重复代码包含进去,通过传入函数指针来调用运算函数,从而完成运算。

  1. //回调函数
  2. int jia(int x, int y) {
  3. return x + y;
  4. }
  5. int jian(int x, int y) {
  6. return x - y;
  7. }
  8. int cheng(int x, int y) {
  9. return x * y;
  10. }
  11. int chu(int x, int y) {
  12. return x / y;
  13. }
  14. void menu() {
  15. printf("**********************\n");
  16. printf("***1.加法 2.减法****\n");
  17. printf("***3.乘法 4.除法****\n");
  18. printf("*** 0.exit ****\n");
  19. printf("**********************\n");
  20. }
  21. int hui(int(*p)(int, int)) {
  22. int x, y;
  23. printf("请输入操作数\n");
  24. scanf("%d%d", &x, &y);
  25. return p(x, y);
  26. }
  27. int main() {
  28. int i, x, y,ret;
  29. do {
  30. menu();
  31. printf("请选择—>");
  32. scanf("%d", &i);
  33. switch (i) {
  34. case 1:
  35. ret = hui(jia);
  36. printf("%d\n", ret);
  37. break;
  38. case 2:
  39. ret = hui(jian);
  40. printf("%d\n", ret);
  41. break;
  42. case 3:
  43. ret = hui(cheng);
  44. printf("%d\n", ret);
  45. break;
  46. case 4:
  47. ret = hui(chu);
  48. printf("%d\n", ret);
  49. break;
  50. case 0:
  51. printf("退出计算\n");
  52. break;
  53. default:
  54. printf("输入错误,重新输入\n");
  55. break;
  56. }
  57. } while (i);
  58. return 0;
  59. }

qsort使用举例

        qsort函数是C语言的库函数,包含在<stdlib.h>头文件中,它可用于对所有数据类型进行排序,包括结构体,使用这个库函数,必须再写个比较元素的函数,返回int型(大于0:大于、等于0:等于、小于0:小于),默认升序,如要进行逆序输出,则在比较函数中,交换操作数的位置。

排序整型数组
  1. //qsort函数,排序整型数组
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. int intcmp (const void* p1, const void* p2) {//比较函数,两个元素的比较
  5. return (*(int*)p1) - (*(int*)p2);
  6. }
  7. int main() {
  8. int arr[6] = { 3,6,2,0,3,8 };
  9. int sz = sizeof(arr) / sizeof(arr[1]);
  10. qsort(arr,//数据类型void*base,用于接受待排序的数组的数组名,也就是首元素的地址
  11. sz,//数据类型sizeof_t,待排序数组的元素个数
  12. sizeof(arr[0]),//数据类型sizeof_t,待排序数组元素字节大小
  13. intcmp);
  14. //数据类型 int(*) (const void*,const void*),用于接收俩个元素比较的函数,
  15. //返回值:大于0(表示大于),等于0(等于),小于0(小于)
  16. for (int i = 0; i < sz; i++) {
  17. printf("%d ", arr[i]);
  18. }
  19. return 0;
  20. }

运行结果:

排序结构体

按字符排

  1. //qsort函数,结构体
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. struct stu {
  6. char name[100];
  7. int age;
  8. int height;
  9. };
  10. int namecmp(const void* p1, const void* p2) {//按名称排
  11. return strcmp((*(struct stu*)p1).name, (*(struct stu*)p2).name);
  12. }
  13. int main() {
  14. struct stu arr[] = { {"zk",18,163},{"tian",19,180},{"xing",17,170} };
  15. int sz = sizeof(arr) / sizeof(arr[1]);
  16. qsort(arr,sz,sizeof(arr[0]),namecmp);
  17. for (int i = 0; i < sz; i++) {
  18. printf("%s %d %d\n", arr[i].name, arr[i].age, arr[i].height);
  19. }
  20. return 0;
  21. }

运行结果

 按照整形排

  1. //qsort函数,结构体
  2. #include<stdio.h>
  3. #include<stdlib.h>
  4. #include<string.h>
  5. struct stu {
  6. char name[100];
  7. int age;
  8. int height;
  9. };
  10. //int namecmp(const void* p1, const void* p2) {//按名称排
  11. // return strcmp((*(struct stu*)p1).name, (*(struct stu*)p2).name);
  12. //}
  13. int agecmp(const void* p1, const void* p2) {//按照年龄排
  14. return (*(struct stu*)p1).age - (*(struct stu*)p2).age;
  15. }
  16. int main() {
  17. struct stu arr[] = { {"zk",18,163},{"tian",19,180},{"xing",17,170} };
  18. int sz = sizeof(arr) / sizeof(arr[1]);
  19. qsort(arr,sz,sizeof(arr[0]),agecmp);
  20. for (int i = 0; i < sz; i++) {
  21. printf("%s %d %d\n", arr[i].name, arr[i].age, arr[i].height);
  22. }
  23. return 0;
  24. }

 运行结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/705041
推荐阅读
相关标签
  

闽ICP备14008679号