再看二叉树的非递归遍历实现,其中在二叉树结构声明这块有如下疑问
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 (*号是谁的*)
首先,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定义的类型,不是编译器真正的实现。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。