星鸿阁

 找回密码
 立即注册
搜索
热搜: 活动 交友 动画
查看: 1141|回复: 1

函数指针例子

[复制链接]

2249

主题

2759

帖子

9603

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9603
发表于 2020-12-29 14:32:44 | 显示全部楼层 |阅读模式
//自行包含头文件
02  void  MyFun1( int  x);                  
03  void  MyFun2( int  x);
04  void  MyFun3( int  x);
05  typedef  void ( * FunType)( int );  //②. 定义一个函数指针类型FunType,与①函数类型一至           //这个是个关键,也就是定义这个标识的东西     FunType就是这个指针名
06  void  CallMyFun( FunType  fp , int  x);
07
08  int  main( int  argc ,  char *  argv [])
09  {
10     CallMyFun( MyFun1 , 10);    //⑤. 通过CallMyFun函数分别调用三个不同的函数
11     CallMyFun( MyFun2 , 20);  
12     CallMyFun( MyFun3 , 30);  
13  }
14  void  CallMyFun( FunType  fp , int  x)  //③. 参数fp的类型是FunType。
15  {
16    fp( x); //④. 通过fp的指针执行传递进来的函数,注意fp所指的函数是有一个参数的
17  }
18  void  MyFun1( int  x)  // ①. 这是个有一个参数的函数,以下两个函数也相同
19  {
20     printf( “函数 MyFun1 中输出: % d \n , x);
21  }
22  void  MyFun2( int  x)
23  {
24     printf( “函数 MyFun2 中输出: % d \n , x);
25  }
26  void  MyFun3( int  x)
27  {
28     printf( “函数 MyFun3 中输出: % d \n , x);
29  }






在嵌入式中操作函数指针十分方便,如:
1  /* 定义一个无参数、无返回类型的函数指针类型  */
2  typedef   void  ( * lpFunction) ( );   
3  /* 定义一个函数指针,指向CPU启动后所执行第一条指令的位置 */
4  lpFunction  lpReset  =( lpFunction) 0xF000FFF0;   
5  /* 调用函数 */
6  lpReset();

IpReset(),它实际上起到了“软重启”的作用,跳转到CPU启动后第一条要执行的指令的位置。









回复

使用道具 举报

2249

主题

2759

帖子

9603

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
9603
 楼主| 发表于 2020-12-29 14:33:08 | 显示全部楼层
函数指针,先赋值,再执行
下面是利用函数指针分别求两个整数的最大值和最小值的用法。

/*
* 求最大值
* 返回值是int类型,返回两个整数中较大的一个
*/
int max(int a, int b) {
        return a > b ? a : b;
}

/*
* 求最小值
* 返回值是int类型,返回两个整数中较小的一个
*/
int min(int a, int b) {
        return a < b ? a : b;
}

int (*f)(int, int); // 声明函数指针,指向返回值类型为int,有两个参数类型都是int的函数

int _tmain(int argc, _TCHAR* argv[])
{
        printf("------------------------------ Start\n");

        f = max; // 函数指针f指向求最大值的函数max
    int c = (*f)(1, 2);

        printf("The max value is %d \n", c);

        f = min; // 函数指针f指向求最小值的函数min
    c = (*f)(1, 2);

        printf("The min value is %d \n", c);

        printf("------------------------------ End\n");
        getchar();
        return 0;
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|starfluidga

GMT+8, 2024-12-21 01:23 , Processed in 0.019777 second(s), 20 queries .

Made by Liga 星鸿阁

Copyright © 2020-2048, LigaStudio.

快速回复 返回顶部 返回列表