C语言第11课

主要内容:函数指针

一、函数指针定义

        int  maxValue(int  a,int  b)

        {

                  return   a > b ?

a : b;

        }

        函数名和数组名一样是地址,存在在代码区


        int  maxValue(int  a。int  b)

        int  (*p)(int。int)=  NULL

        函数指针定义。p是变量,其它是类型(通常没有形參a。b)

        p = maxValue(函数指针的使用:赋值函数名)

        int  m = p(3,5)(指针可当函数用)


       练习:定义两个函数,一个求最大值,一个求和。用户从控制台输入两个整数,在从控制台输入max或sum分别求

                   3和5的最大值或和,(提示:定义一个函数指针,依据输入内容指向不同的函数。最后一次调用完毕)

        int  maxValue ( int a, int  b )    / / 求最大值的函数

        { 

                 return  a > b ? a : b;

        }

        int  sumValue ( int a, int b )     / / 求和的函数

        {

                return  a + b;

        }


        int  main( int argc, const char *argv[])

        {

                void (*p) (int , int) = NULL;                           / / 定义一个指针变量

                int   a  , b;                                                     / / 定义两个须要用的整型变量

                printf(" 请输入两个整数: ");                        / / 让用户输入两个整数

                scanf(" %d%d ",&a,&b);                               / / 标准的输入函数

                printf(" 请输入sum或者max: ");                 / /  让用户输入sum或者max

                char  *name = malloc(sizeof(char) * 10);     / /  申请char类型的乘以10的内存空间

                scanf(" %s ", name);

                / / 推断用户输入的是sum还是max

                if (strcmp(name, " sum ") == 0){

                p = sumValue;

                }else if (strcmp(name, " max ") == 0){

                p = maxValue;

                }else {

                printf(" 输入错误,失败 ");

                }

                free (name);        / /  释放内存,一定不能忘


                int  result = p(a, b);/ /  定义result接收结果

                printf(" %d ", result);/ /  输出结果

         }


二、回调函数

       函数指针做參数

       int  getValue(int  a, int  b, int  (*p)(int , int));

       getValue: 函数名

       int (*p)(int ,int): 函数指针做getValue函数的參数

       int  value = getValue(3, 5, maxValue);(函数调用:getValue函数运行过程中再调用(回调)maxValue)

       如图所看到的:



        练习:写一函数查找成绩在90分以上的学生,是用回调函数在姓名后面加“高富帅”

                typedef  struct {           / /  定义一个结构体

                char name[20];

                int  age;

                float  score;

                } Student;

                void  printfStudent(Student  *stu, int  count)。

                void  printfStudent(Student  *stu, int  count)   / /  声明并编写一个打印结构体数组的函数

                {

                        for(int  i = 0; i < count ; i++){

                        printf("%s %d %.2f", (stu + i) ->name, (stu + i) ->age, (stu + i) ->score);

                        }

                }


/ / 声明并编写查找90分以上的学生并在姓名后面加“高富帅”

               void  changeStudent(Student  *stu, int count,  void (*p)(Student  *));

               void  changeStudent(Student  *stu, int count,  void(*p)(Student  *))  

               {

                         for (int  i = 0; i < count ; i++){

                                   if ((stu + i) ->score >= 90){

                                           p(stu + i); 

                                  }

                           }

               }


               void  changeName(Student *stu);

               void  changeName(Student *stu)

               {

                         strcat (stu ->name, " 高富帅 ");

               }


               int  main(int argc, const char*argv[]){

               Student  student = {/ / 定义结构体变量

                        {" 方世玉 ", 26,  92},

                        {" 令狐冲 ", 30,  89},

                        {" 韦小宝 ", 27,  99},

                        {" 花仙子 ", 20,  80},

                        {" 大教主 ", 24,  80}

                };

                int  count  = sizeof(student) / sizeof(Student);  / / 求结构体数组的长度


                printfStudent(stuent, count); / / 打印没查找前的结构体数组


                changeStudent(student, count, changeName); / / 推断是否符合条件90分以上的进行改变


                 printfStudent(student,  count)  / / 打印查找后的结构体数组

          }

三、动态排序

        排序需求不定,无法预測的需求变更

        void  sortArray(int  *array,  int  count)

        {

                  for (int i = 0; i < count - 1; i++){

                             for (int j = 0; j < count - 1 - i; j++){

                                          if (条件(需求)) {

                                                   交换

                                          }

                              } 

                  }

          }

          决定排序方式的重要语句封装成函数在此回调


          int 数组动态排序

          typedef  BOOL(* PFUNC)(int , int);   / / 为函数指针类型起名为PFUNC

          void  sortArray(int  *array, int count , PFUNC  p);  / / 动态函数排序声明

          演示样例:

/ / 1:创建一个结构体

                 typedef  struct {

                 char  name[20];

                 int  age;

                 float  score;

                 } Student;


                 / / 3:打印学生结构体数组的函数

                 void  printfStudent(Student  *stu,  int  count);

                 void  printfStudent(Student  *stu,  int  count)

                 {

                           for (int  i = 0; i < count; i++){

                                      printf("%s %d %.2f",(stu + i) ->name, (stu + i) ->age,  (stu + i) ->score);

                           }

                           printf(" ");

                  }


                  / / 5:写一个函数依据分数从小到大排序

                  void   paiXuStudent(Student  *stu,  int  count,  BOOL (*PFUNC)(Student  *stu1,  Student  *stu2));

                  void   paiXuStudent(Student  *stu,  int  count,  BOOL (*PFUNC)(Student  *stu1,  Student  *stu2))

                  {

                              for (int  i = 0; i < count - 1; i++){

                                         for (int  j = 0; j < count - 1 - i; j++){

                                                      if (PFUNC((stu + j), (stu + j + 1))){

                                                                  Student  temp;

                                                                  temp = *(stu + j);

                                                                  *(stu + j) = *(stu + j + 1);

                                                                  *(stu + j + 1) = temp;

                                                      }

                                         }

                              }

                   }


            / / 6:定义一个按分数比較大小的函数

            BOOL  biJiaoScore(Student  *stu1,  Student  *stu2);

            BOOL  biJiaoScore(Student  *stu1,  Student  *stu2)

            {

                          return  stu1 ->score  >  stuff ->score;

             }


            / / 定义一个按年龄排序的函数

           BOOL  compareAge(Student  *stu1, Student  *stu2);

           BOOL  compareAge(Student  *stu1, Student  *stu2)

           {

                        return  stu1 ->age  >  stuff ->age

           }


           int  main(int  argc, char  * argv[]){

                            / / 2:创建学生结构体数组

                            Student  *student = {

                                     {"索隆",  22,  93},

                                     {"香吉士",  21,  97},

                                     {"犬夜叉",  20,  80},

                                     {"路飞",  19,  70}

                            };

                           / / 4:排序前调用打印函数打印结构体数组

                           int  count = sizeof(student) / sizeof(Student);

                           printfStudent(student, count);

                           / / 7:调用函数

                           paiXuStudent(student,  count , biJiaoScore);

                           / / paiXuStudent(student,  count , compareAge);按年龄排序(仅仅需传入函数就可)

                           / / 8:打印排序后的结构体数组

                           printfStudent(student,  count);

                 }


版权声明:本文博主原创文章,博客,未经同意不得转载。

原文地址:https://www.cnblogs.com/mengfanrong/p/4844743.html