C语言函数指针应用例题详解

本文通过实例详细讲解了函数指针的概念及其在C语言中的应用,包括如何定义和使用函数指针来找出两个数的最大值。此外,还介绍了回调函数的概念及其实现过程,演示了如何使用回调函数为80分以上的学生名字后拼接上“三好学生”。


1.函数指针:
   找出两个数的最大值:
          int maxValue(int a,int b)  //返回最大值的函数
          {
               return a>b?a:b;    
          }
          int main()
          {
               int a = 3;
               int b = 5;
               int (*p)(int a,int b);  //定义一个结构体指针,它的参数类型要和你指向的函数的参数类型保持一致。(注意定义的方法)
               p = maxValue;     //函数的内存在代码区,函数名代表函数的首地址,所以可以让你定义的函数指针指向它的首地址。
               int max = p(a,b);   //调用该函数指针。(注意调用的方法,初学一般都是看过了就觉得记住了,过一会就忘了)。
               printf(“%d”,max);
               }
    对于本题也可以同时用p指向数个函数,eg:int minValue(int a,int b)等。
          函数指针的优点:(1)可以调用函数(只知道类型和功能,不用知道实现的内容)(2)可以重复指向调用(3)它是为学习面向对象语言打基础的,一定要搞明白
2.回调函数:
   对于回调函数其实和嵌套函数有相似之处。不同点只是在于回调函数定义了一个函数指针指向了所要引用的函数,并且函数指针作为了形参。这是第一点比较难理解的 地方。第二点就是在于函数要调用时的用法,初学者一定要注意这个地方。我们用例子来看:
   题目:为80分以上的同学名字后面拼接上“三好学生”

  #include <stdio.h>

  #include <stdlib.h>

  #include <string.h>

  typedefstruct student      //定义一个结构体存放学生信息

  {

      char name[20];

      int score;

      int age;

  }Stu;

  void pinjie(char name[])     //这是被调用的函数,被函数指针所指向的函数。它是一个工程的具体实现。

  {

      strcat(name, "三好学生");

  }

  void f1(Stu stu[],int n,void (*p)(char name[])) //结构体数组,数组长度,函数指针作为形参。(注意函数指针的定义,组成元素和目的)。

  {

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

          if (stu[i].score>80) {

              p(stu[i].name);          //调用函数(注意参数的传递)。

          }

      }

  }

  int main(int argc, constchar * argv[])

  {

      Stu stu[5] = {

          {"zhangdsan",69,25},

          {"lisi",86,26},

          {"wangwu",67,21},

          {"maliu",78,20},

          {"tangqi",63,27}

      };

      f1(stu,5,pinjie);            //调用实现函数(注意参数的传递和调用方式,如果函数是有返回值的就要用一个跟函数类型一样的变量来接收它)。

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

          printf("%8s%8d%8d\n",stu[i].name,stu[i].score,stu[i].age);

      }

            return0;

   }

 

转载于:https://www.cnblogs.com/shushulele/p/3834603.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值