开发者社区> 问答> 正文

事关typedef

再看二叉树的非递归遍历实现,其中在二叉树结构声明这块有如下疑问

typedef struct BiTNode{
        char data;
        BiTNode *lchild, *rchild;
    }BiTNode,*BiTree;
我知道typedef是换个别名,例如 typedef int a,a就成了int.
在上面这个声明中是不是就相当于typedef BiTNode *BiTree,上面将BiNode的定义和typedef连在了一起,BiTree的类型是什么?
分开写的话我这么写对吗?

struct BiTNode
{
};
typedef BiTNode  *BiTree  (*号是谁的*)

展开
收起
a123456678 2016-06-08 21:14:35 2015 0
1 条回答
写回答
取消 提交回答
  • 首先,struct struct_name { propType propname;} 声明了一个结构体。
    而用它定义变量的写法是struct struct_name variable1,variable2,*pvariable。很简单的代码。
    其实,他们是可以写到一起的。就是

    struct struct_name { propType propname;} var,var2,*pvar;
    typedef 其实对于学习者理解成用变量名替换类型定义中的类型名更好一点儿(私以为书上说的都不对,typedef int a,不是让a变成了int,不过从C语言标准的层面上讲也没什么错)举个例子就是:

    typedef int t1;
    t1 a;
    //相当于
    int a; //是用 a 替换掉了 t1

    typedef int (*p)[20];
    p b;
    //相当于
    int (*b)[20];
    当然,这里说的是相当于并不是完全等价,其实是编译器可以理解typedef的,所以可以编译出正确的代码。你的那个就是:

    struct BiTNode {};
    typedef BiTNode *BiTree
    BiTree b;
    //相当于
    BiTNade *b;
    //在标准C里面这句好像是编译出错的,在C++里是可以编译的。
    其实这个并不是等价于下面这个定义。

    typedef struct BiTNode{ char data;BiTNode lchild, rchild;}BiTNode,*BiTree;
    BiTree b;
    //相当于
    struct BiTNode{ char data;BiTNode lchild, rchild;} *b;
    //因为编译器可以理解(或者说是我们理解我们的意思)
    //所以自然不会把不是我们真正想要的 BiTNode加上
    //把BiTNode定义为一个变量,typedef并不是宏。
    在这里说的是我们该如何确定typedef定义的类型,不是编译器真正的实现。

    2019-07-17 19:32:46
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载