zoukankan      html  css  js  c++  java
  • C++------------typedef 函数指针类型定义

    摘要bycrazyhacking:

           typedef 是定义了一种“函数指针”类型,可以再声明很多变量。函数指针的定义是定义了一个变量。

    int max(int x,int y){ return(x>y?x:y); }
    1.定义函数指针类型:
    typedef int (*fun_ptr)(int,int);
    2.声明变量,赋值:
    fun_ptr max_func=max;


    进入正文:

     代码简化, 促进跨平台开发的目的.

     typedef 行为有点像 #define 宏,用其实际类型替代同义字。

     不同点:typedef 在编译时被解释,因此让编译器来应付超越预处理器能力的文本替换

    用法一:

    typedef int (*MYFUN)(int, int)
    这种用法一般用在给函数定义别名的时候
    上面的例子定义MYFUN 是一个函数指针, 函数类型是带两个int 参数, 返回一个int 

    分析这种形式的定义的时候可以用下面的方法: 
    先去掉typedef 和别名剩下的就是原变量的类型. 
    去掉typedef和MYFUN以后就剩:
     
    int (*)(int, int)

    用法二:

    typedef给变量类型定义一个别名.

    typedef struct{ 
    int a; 
    int b; 
    }MY_TYPE

    这里把一个未命名结构直接取了一个叫MY_TYPE的别名, 这样如果你想定义结构的实例的时候就可以这样: 
    MY_TYPE tmp;

     

    第二种用法:typedef 原变量类型 别名

    简单的函数指针的用法

    //形式1:返回类型(*函数名)(参数表)

    char(*pFun)(int);

    //typedef char(*pFun)(int)   //跟上一行功能等同

    /*typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。*/

    char glFun(int a){return;}

    void main()

    {

    pFun =glFun;

    (*pFun)(2);

    }

    第一行定义了一个指针变量pFun.它是一个指向某种函数的指针,这种函数参数是一个int类型,返回值是char类型。只有第一句我们还无法使用这个指针,因为我们还未对它进行赋值

    第二行定义了一个函数glFun().该函数正好是一个以int为参数返回char的函数。我们要从指针的层次上理解函数-函数的函数名实际上就是一个指针函数名指向该函数的代码在内存中的首地址

     

    下面是一个例子:

    C代码  收藏代码
    1. //#include<iostream.h>  
    2. #include<stdio.h>  
    3.   
    4. typedef int (*FP_CALC)(intint);  
    5. //注意这里不是函数声明而是函数定义,它是一个地址,你可以直接输出add看看  
    6. int add(int a, int b)  
    7. {  
    8.      return a + b;  
    9. }  
    10. int sub(int a, int b)  
    11. {  
    12.      return a - b;  
    13. }  
    14. int mul(int a, int b)  
    15. {  
    16.      return a * b;  
    17. }  
    18. int div(int a, int b)  
    19. {  
    20.      return b? a/b : -1;  
    21. }  
    22. //定义一个函数,参数为op,返回一个指针。该指针类型为 拥有两个int参数、  
    23. //返回类型为int 的函数指针。它的作用是根据操作符返回相应函数的地址  
    24. FP_CALC calc_func(char op)  
    25. {  
    26.      switch (op)  
    27.      {  
    28.      case '+'return add;//返回函数的地址  
    29.      case '-'return sub;  
    30.      case '*'return mul;  
    31.      case '/'return div;  
    32.      default:  
    33.          return NULL;  
    34.      }  
    35.      return NULL;  
    36. }  
    37. //s_calc_func为函数,它的参数是 op,  
    38. //返回值为一个拥有 两个int参数、返回类型为int 的函数指针  
    39. int (*s_calc_func(char op)) (intint)  
    40. {  
    41.      return calc_func(op);  
    42. }   
    43. //最终用户直接调用的函数,该函数接收两个int整数,和一个算术运算符,返回两数的运算结果  
    44. int calc(int a, int b, char op)  
    45. {  
    46.      FP_CALC fp = calc_func(op); //根据预算符得到各种运算的函数的地址  
    47.          int (*s_fp)(intint) = s_calc_func(op);//用于测试  
    48.          // ASSERT(fp == s_fp);   // 可以断言这俩是相等的  
    49.      if (fp) return fp(a, b);//根据上一步得到的函数的地址调用相应函数,并返回结果  
    50.      else return -1;  
    51. }  
    52.   
    53. void main()  
    54. {     
    55.     int a = 100, b = 20;  
    56.   
    57.      printf("calc(%d, %d, %c) = %d ", a, b, '+', calc(a, b, '+'));  
    58.      printf("calc(%d, %d, %c) = %d ", a, b, '-', calc(a, b, '-'));  
    59.      printf("calc(%d, %d, %c) = %d ", a, b, '*', calc(a, b, '*'));  
    60.      printf("calc(%d, %d, %c) = %d ", a, b, '/', calc(a, b, '/'));  
    61. }  

     运行结果

       calc(100, 20, +) = 120

       calc(100, 20, -) = 80

       calc(100, 20, *) = 2000

       calc(100, 20, /) = 5

     

     

  • 相关阅读:
    vs2015调试慢
    阿里正式发布《Java开发手册》终极版!
    为什么听有些人讲话让人抓狂
    hibernate 映射实例 学生 课程 成绩
    hibernate 树状映射
    hibernate 一对多双向的CURD
    hibernate 多对多双向关联
    hibernate 多对多单向
    hibernate 一对多双向
    hibernate 一对多关联
  • 原文地址:https://www.cnblogs.com/catkins/p/5270517.html
Copyright © 2011-2022 走看看