• typedef void(*Func)(void)


    转载:https://zhuanlan.zhihu.com/p/372557271

    void (*Fun)(void);假如就只是写上这样的一句代码,显然这就是定义了一个变量Fun,这个Fun变量是一个指针,指向返回值和参数都是空的函数的指针。而typedef void(*Func)(void) 是函数指针的类型定义,代表了一种新的类型。作用是声明一个 void(*)()类型的函数指针Func。这些基础知识我们一步一步来学习了解一下。

    typedef/define的基本概念

    typedef

    现有类型创建一个新的名字,基本用法举例:

    typedef unsigned char UCHAR;//右边代替左边
    

    typedef能隐藏笨拙的语法构造以及平台一些相关的数据类型,可以使得代码更美观,可维护性、可移植性、可读性更强,来举个例子吧。

    //定义一个函数
    void tech(void) { printf("tech dreamer"); }
    void main()
    {
        //定义一个指针,指针的名字叫func
        void (*func)();//tech函数带参数的话也可以
        func = &tech; //&可以不加
        func();        //第一种调用方式,带参数也可以
        (*func)();     //第二种调用方式,带参数也可以
    }
    

    为了写出更加美观和可读性强的代码,我们经常使用typedef来定义一个类型,代码如下。

    void tech(void) { printf("tech dreamer"); }
    //命名一个类型,那么这个时候func不可以直接调用,而是一个类型了
    typedef void (*func)();
    void main()
    {
        //定义一个可调用的指针变量(函数):myfunc
        func myfunc;
        myfunc = &tech; //&可以不加
        myfunc();         //第一种调用方式,带参数也可以
        (*myfunc)();      //第二种调用方式,带参数也可以
    }
    

    与define的区别

    typedef 是在编译过程中被解析的,而#define是在编译之前的预处理时被破解的;#define只是对所定义的别名的简单替换,而typedef可以做到#define能做到的所有事情,而且可以做得更好

    函数指针的基本概念

    我们先了解一下函数指针的基本概念,函数指针是指向函数的指针变量,他的本质是一个指针变量,函数的指针定义:int (*f)(int);

    //举个例子声明一个函数指针
    int (*f)(int x);
    f=func; /* 将func函数的首地址赋给指针f */
    

    与指针函数的区别

    指针函数是返回值是某一类型指针的函数,即本质是一个函数,指针函数定义:int *fun(int x);,举个例子如下

    float *fun();  
    float *p;  
    p = fun(a);  
    

    这个函数的返回值是一个地址值,赋值给用同类型的指针变量p,也就是说,指针函数一定有函数返回值,而且在主调函数中,函数返回值必须赋给同类型的指针变量。

    两者主要的区别是一个是指针变量,一个是函数。

    typedef void(*Func)(void)为什么能这么用?

    可能我们有这样的疑问,typedef一般的用法不是取个新名字吗?如果仿照变量类型声明,应该是这样typedef void(*)() variable;才比较眼熟易懂。

    说一说我的理解,我们知道C语言的函数在被调用的时候是执行了一条转移指令,这条指令包含要转移到的地方的数据,同理,变量代表了一个地址,当你引用一个变量的时候,计算机会把这个地址的数据拿出来参与运算。

    那么函数名也是一样,函数名代表的是一段代码的入口地址,引用了这个函数,那么计算机会使用转移指令转移到函数名代表的地址

    所以typedef void(*Func)(void)相当于定义了一种类型,这个类型具有下面的特征:他是一个函数,没有返回值,没有参数。

    因为处理器在进行上下文切换或者转移的时候要进行现场保护,不同的函数对现场保护的内容可能不一样,传入的参数使用的栈也不一样,相同类型的函数保证了现场保护的内容是一样的,参数的形式也是一样的。所以这样使用可以像用指针引用数据一样使用函数。

    typedef void(*Func)(void)的应用

    用法的好处,定义一个函数指针类型。

    例子:

    上面说到typedef void(*Func)(void)可以使得代码更可移植性、可读性更强,我们举个例子,有三个类型相似或功能相似的函数:

    //构造3个通用函数
    void TEST1(void) { printf("test1\n"); }//函数定义  
    void TEST2(void) { printf("test2\n"); }//函数定义  
    void TEST3(void) { printf("test3\n"); }//函数定义  
    ... ...  
    //声明  
    typdef void (*func)(void);
    

    再来定义一个调用的函数

    void test(int i)  
    {  
      func vTask[3] = {&TEST1, &TEST2, &TEST3};  
      func fun = vTask[i];  
      (*fun)();  
    }  
    

    在main函数中,分别调用这几个不同输入参数的函数

    void main()
    {
      test(0);
      test(1);
      test(2);
     return 0;
    }
    

    这样的话代码就看着很舒服了。

     

    转载:https://blog.csdn.net/u014221279/article/details/50978204

    typedef void (*Fun) (void) 的理解——函数指针——typedef函数指针

    首先介绍大家比较熟悉的typedef

    int i;//定义一个整型变量i
    typedef int myInt;
    myInt j;//定义一个整型变量j


    上面介绍得是我们常用的比较简单的typedef的用法,下面首先介绍一下函数指针。

    函数指针的形式:

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

    #include <iostream>

    using namespace std;
    //定义一个函数指针pFUN,它指向一个返回类型为char,有一个整型的参数的函数
    char (*pFun)(int);
    //定义一个返回类型为char,参数为int的函数
    //从指针层面上理解该函数,即函数的函数名实际上是一个指针,
    //该指针指向函数在内存中的首地址
    char glFun(int a)
    {
    cout << a;
    //return a;
    }

    int main()
    {
    //将函数glFun的地址赋值给变量pFun
    pFun = glFun;
    //*pFun”显然是取pFun所指向地址的内容,当然也就是取出了函数glFun()的内容,然后给定参数为2。
    (*pFun)(2);
    return 0;
    }
    通过上面的一个小例子,我们知道了函数指针的用法,

    而typedef可以让函数指针更直观方便

    形式2:typedef 返回类型(*新类型)(参数表)

    typedef char (*PTRFUN)(int);
    PTRFUN pFun;
    char glFun(int a){ return;}
    void main()
    {
    pFun = glFun;
    (*pFun)(2);
    } </span>

    typedef的功能是定义新的类型。第一句就是定义了一种PTRFUN的类型,并定义这种类型为指向某种函数的指针,这种函数以一个int为参数并返回char类型。后面就可以像使用int,char一样使用PTRFUN了。
    第二行的代码便使用这个新类型定义了变量pFun,此时就可以像使用形式1一样使用这个变量了。

    转载:https://blog.csdn.net/nb_zsy/article/details/104439525

    函数指针定义与使用typedef void (*pfun)(int data);

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

    void myfun(int data)
    {
    printf(“get data:%d\n”,data);
    }

    可以如此使用:
    pfun p= myfun; //函数指针指向执行函数的地址
    p(100);

  • 相关阅读:
    使用zipkin2在SpringCloud2.0环境下追踪服务调用情况
    Spring Cloud负载均衡:使用Feign作客户端负载均衡
    Spring Cloud负载均衡:使用zuul作服务器端负载均衡
    Word模板替换
    【转】Eureka集群
    巧用JavaScript语言特性解耦页面间调用(观察者模式)
    MySQL 视图触发器事务存储过程函数
    MySQL py模块的链接Navicat可视化工具
    MySQL 单表查询多表查询
    MySQL 表与表之间建立关系
  • 原文地址:https://www.cnblogs.com/zhiminyu/p/16349326.html
Copyright © 2020-2023  润新知