• 关于typedef的用法


    参考:http://www.cnblogs.com/csyisong/archive/2009/01/09/1372363.html

       https://wenda.so.com/q/1471668835727989?src=9999&cid-pre=1000204

    typedef在简单的别名用法中经常用来和#define比较。

    以下参考《C语言内核解析》3.9.5小节及4.6节

    #define与typedef都可以用来给现有类型起别名。#define只是简单宏替换,在预编译时被处理。typedef不是简单替换,它具有语义分析,是一种存储类的关键字,用来为复杂的声明定义简单的别名。

    简单应用中的区别

    #define和typedef写法的区别在于:#define原型在后,别名在前  typedef原型在前,别名在后

    区别一:#define简单替换,typedef不是

    #define dpchar char *;

    typedef char * tpchar;

    dpchar p1,p2;    //只是简单的替换,等价于 char *p1,p2;只有p1才是指针变量

    tpchar p1,p2;    //不是简单的替换,等价于 char *p1,p2;p1,p2都是指针变量

    区别二:#define可实现类型组合,typedef不行

    #define dint int;

    typedef int tint;

    unsigned dint p1,p2;  //正确,等价于unsigned int p1,p2

    unsigned tint p1,p2;  //不可以

    区别三:typedef可以组建新类型,但是#define不行

    typedef char[200] charBuf;

    charBuf buf;      //等价于char buf[200],但是#define不行

    typedef的复杂用法

    数据结构组合

    typedef char Line[81]  Line类型代表具有81个元素的字符数组。Line t 就等同于char t[81]。参考https://wenda.so.com/q/1471668835727989?src=9999&cid-pre=1000204

    函数指针

    typedef  int  (*fun_ptr)(int,int);  //typedef行

    int     (*fp)(int,int);        //原型行

    fun_ptr   fp;            //应用行

    “typedef行”和“原型行”相比,“typedef行”仅仅多个typedef,根本区别在于,fun_ptr是类的别名,fp是该类的变量。“原型行”和“应用行”的编译结果是一样的。他们都是创建了一个类型为int(*)(int,int)的函数指针fp。只是应用行比原型行这种形式更加简洁,便于书写和理解。

    形式越复杂,typedef的优势就越明显。

    typedef和struct

     typedef和struct组合是常见用法

    C语言中struct普通用法:struct node n;

    配合typedef:

    1、利用结构体类型申请变量时就可以省略掉struct这个关键字。

    typedef struct node  //给struct node{ }类型取别名

    {

    }Node;

    Node  n;     //利用结构体类型申请变量

    2、使用typedef一次定义两个类型,分别是结构体类型和结构体指针类型

    typedef struct node

    {

    } Node,*pNode;

    其中Node为结构体类型,pNode是结构体指针类型。

    typedef与const

    1、typedef int *PINT;

       const PINT p2;

    相当于是int *const p2;

    2、typedef int *PINT;

       PINT const p2;

    相当于是int *const p2;

    3、const int *p写成

      typedef const int *CPINT;

      CPINT p;

     

    使用typedef的两个重要意义:(1)简化类型,让程序更易理解和书写。 (2)创造平台无关类型,便于移植【写不同的平台时定义相同别名】

  • 相关阅读:
    laravel 控制器方法里存get值 和 blade 模板获得闪存值的方法
    获取对象中的值的方法
    python3 语法小结
    集合一些方法陷阱
    文件的读写操作
    字符编码
    数字,字符串,列表,元祖,字典,集合类型内置方法
    if判断,while循环,for循环
    交互,格式化输出,运算符,解压缩!
    python基础知识
  • 原文地址:https://www.cnblogs.com/tangtangde12580/p/8283588.html
Copyright © 2020-2023  润新知