• typedef



     typedef用来声明一个别名,typedef后面的语法,是一个声明。本来笔者以为这里不会

     

    产生什么误解的,但结果却出乎意料,产生误解的人不在少数。罪魁祸首又是那些害人的

     

    教材。在这些教材中介绍typedef的时候通常会写出如下形式: typedef int PARA; 这种

     

    形式跟#define int PARA几乎一样,如前面几章所述,这些教材的宗旨是由浅入深,但

     

    实际做出来的行为却是以偏盖全。的确,这种形式在所有形式中是最简单的,但却没有对

     

     typedef进一步解释,使得不少人用#define的思维来看待typedef,把int与PARA分开

     

    来看,int是一部分,PARA是另一部分,但实际上根本就不是这么一回事。int与PARA是

     

    一个整体!就象int i:声明一样是一个整体声明,只不过int i定义了一个变量,而typedef

     

    定义了一个别名。这些人由于持有这种错误的观念,就会无法理解如下一些声明: 

     

    typedef int a[10]; typedef void (*p)(void); 他们会以为a[10]是int的别名,(*p)(void)是

     

    void的别名,但这样的别名看起来又似乎不是合法的名字,于是陷入困惑之中。实际

     

    上,上面的语句把a声明为具有10个int元素的数组的类型别名,p是一种函数指针的类

     

    型别名。 虽然在功能上,typedef可以看作一个跟int PARA分离的动作,但语法上

     

    typedef属于存储类声明说明符,因此严格来说,typedef int PARA整个是一个完整的

     

    声明。 定义一个函数指针类型。 比如原函数是 void func(void); 那么定义的函数指针

     

    类型就是typedef void (*Fun)(void); 然后用此类型生成一个指向函数的指针: Fun

     

     func1; 当func1获取函数地址之后,那么你就可以向调用原函数那样来使用这个函数指

     

    针: func1(void);

    01 

    重点是要明白声明的“typedef名称”和什么同义。
    比如在typedef void (* Func)(void) 中,要被声明的“typedef名称”是Func,也就是说,Funcvoid (*变量名)(void) 同义。而void (*变量名)(void)是一种函数指针形式,那么Func也就是这种函数指针的同义了。

    02 
    先熟悉指针函数的声明形式:数据类型 (* 指针变量名) (形参列表);
    例如: int (* func)(void);//这是一个变量声明语句(指针函数的声明),声明了一个函数指针变量func,注意区别指针函数和函数指针。 func = &test; //变量赋值(给指针函数赋值);


    03 
     


    那么现在来理解typedef int (* func)(void)语句;
    1.去掉"typedef"得到一个正常的变量声明语句(指针函数声明): int (*func)(void);这里变量func的类型为一个函数类型,而当加上”typedef"后,就得到一个新的类型, 原来的变量名称func就变成新类型的名称,func不再是变量名称,而是一个新类型名--func,用这个新的类型就可以去定义和原来func变量相同类型的变量,注意看去除和加上"typedef“时func的变化,没有"typedef"时,func为变量名,加上"typedef"时,func为类型名(这个类型等同于原来func变量的类型),因此下面正确:

    typedef int (* t_func)(void);//定义了一个新类型 t_func;
    int (*func)(void); 变量声明语句(指针函数声明):
    //....
    t_func func2 = func; //func2和func是相同类型,这就好理解加上"typedef"产生的变化了。

    可以这么想,加上"typedef"关键字后,原来语句声明的变量变成类型,以下正确:
    1. int id; ==> typedef int ID; //在加上"typedef"后,变量id就变成类型ID(为了清楚,把类型变大写),这个新类型等同于原来变量对应的类型; id <==>ID id ;
    2. int a[10]; ==> typedef int A[10];//加上"typedef"后,变量a就成了类型A(为了清楚,把类型变大写),这个新类型等同于原来变量对应的类型; a <=> A a; 


     

     


    那么现在来理解typedef int (* func)(void)语句;
    1.去掉"typedef"得到一个正常的变量声明语句(指针函数声明): int (*func)(void);这里变量func的类型为一个函数类型,而当加上”typedef"后,就得到一个新的类型, 原来的变量名称func就变成新类型的名称,func不再是变量名称,而是一个新类型名--func,用这个新的类型就可以去定义和原来func变量相同类型的变量,注意看去除和加上"typedef“时func的变化,没有"typedef"时,func为变量名,加上"typedef"时,func为类型名(这个类型等同于原来func变量的类型),因此下面正确:

    typedef int (* t_func)(void);//定义了一个新类型 t_func;
    int (*func)(void); 变量声明语句(指针函数声明):
    //....
    t_func func2 = func; //func2和func是相同类型,这就好理解加上"typedef"产生的变化了。

    可以这么想,加上"typedef"关键字后,原来语句声明的变量变成类型,以下正确:
    1. int id; ==> typedef int ID; //在加上"typedef"后,变量id就变成类型ID(为了清楚,把类型变大写),这个新类型等同于原来变量对应的类型; id <==>ID id ;
    2. int a[10]; ==> typedef int A[10];//加上"typedef"后,变量a就成了类型A(为了清楚,把类型变大写),这个新类型等同于原来变量对应的类型; a <=> A a; 

     

    04  

     

    typedef其实很好理解,你知道如何声明变量/函数/指针函数/结构体 等等C语言中的各种对象吧?
    在这些声明式前加上typedef 就将你声明的变量名转换成该类型的代名词。举几个例子吧
    typedef int INT;这个例子其实比较有误导性,好像把int换了个名字似的。但实际上,看作int INT(声明了一个整形变量),再在前面加上typedef 把INT转变为int的代名词
    再举个复杂点的例子
    typedef void (*fp)();这里如果没有typedef,fp就是一个指针函数 指向一个返回值为void, 不接收参数的函数。加了typedef后 fp就变成了这种指针函数的代名词。也就是说
    fp x;
    //对x赋值
    (*x)();//就可以调用到x指向的函数了


     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    HTML多媒体标记之字幕标记
    认识JS的基础对象,定义对象的方法
    JDBC-ODBC桥接器连接Access数据库
    使用JQuery制作幻灯片(轮播图)
    开博11天后的第一次随笔!
    Springboot配置MongoDB连接增加mongoplus支持
    云服务器部署集锦 阿里ESC+docker+mysql+Portainer+rabbitmq+mongo
    centos8安装docker
    vue cli的使用
    MyBatis Plus数组list存入数据库之TypeHanlder类转换器
  • 原文地址:https://www.cnblogs.com/LiLihongqiang/p/5542933.html
Copyright © 2020-2023  润新知