• typedef结构体


    typedef struct BiTNode{
        TElemType  data;
        struct BiTNode *lchild,*rchild;
    }BiTNode,*BiTree;

    typedef的定义:

    typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。

    在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。


    例如:typedef int k;   则k就是int的别名。 用k就可以代替int。

    开头的代码可以写成如下:

    typedef struct BiTNode{ TElemType  data;  struct BiTNode *lchild,*rchild;}BiTNode,*BiTree;
    可以看出:
    struct是一个结构体,然后typedef 对结构体赋予别名。

      c语言的结构体是应该这样定义的:

    struct  tagMyStruct

     int iNum; 
     long lLength; 
    };

    分析:tagMyStruct称为“tag”,即“标签”,实际上是一个临时名字,struct 关键字和tagMyStruct一起,构成了这个结构类型,不论是否有typedef,这个结构都存在。

    我们可以用struct  tagMyStruct  Name来定义变量,但要注意,使用tagMyStruct Name来定义变量是不对的,因为struct 和tagMyStruct合在一起才能表示一个结构类型。

    当如下定义的时候:

    typedef struct tagMyStruct

     int iNum;

     long lLength;

    } MyStruct; 

    我们就可以用MyStruct来标识struct tagMyStruct  ,也就是说,MyStruct是struct tagMyStruct的别名。


    下面有一个错误例子:

    typedef struct tagNode
    {
     char *pItem;
     pNode pNext;
    } *pNode;  

    C语言当然允许在结构中包含指向它自己的指针pNode,我们可以在建立链表等数据结构的实现上看到无数这样的例子,上述代码的根本问题在于typedef的应用。

    typedef struct tagNode{char* pltem; pNode pNxet;}*pNode;   这样子看,

    新结构建立的过程中遇到了pNext域的声明,类型是pNode,要知道pNode表示的是类型的新名字,那么在类型本身还没有建立完成的时候,这个类型的新名字也还不存在,也就是说这个时候编译器根本不认识pNode。

    解决方法:

    第一种解决办法:

    typedef struct tagNode
    {
     char *pItem;
     struct tagNode pNext;
    } *pNode;  

    第二种:

    typedef struct tagNode *pNode;

    struct tagNode{

     char *pItem;

     pNode pNext;

    }

    规范最好用第一种。

    tianjiale菜鸟名企梦
  • 相关阅读:
    网络编程
    网络参考模型
    面向对象中类的成员
    Forward(请求转发)和Redirect(重定向)的比较
    AOP详解
    JDK动态代理和CGLib代理对比
    内存可见性问题分析
    Java中创建对象的5种方式
    基于Spring的动态路由AbstractRoutingDataSource实现动态分库
    在java中String类为什么要设计成final?
  • 原文地址:https://www.cnblogs.com/tianjiale/p/10816121.html
Copyright © 2020-2023  润新知