(1)不用typedef,这个时候,我们定义结构并使用的时候,都是前面有struct的,
这个时候struct sName 是一个整体,不可分割,所以,我们在自引用的时候是这样的:
struct Tnode{
struct Tnode *left; // 关键字 struct 是必须要有的
struct Tnode *right;
int value;
};
在用这个结构定义变量的时候也一样,必须要有struct 这个关键字才行。所以,我们必须这样(在C语言中):
struct Tnode{
struct Tnode *left;
struct Tnode *right;
int value;
};
int main()
{
struct Tnode *root;
return 0;
}
但是在c++中,却不是这样的,并没有把 struct sName 看成一个整体,所以这样是可以的:
struct Tnode{
Tnode *left;
Tnode *right;
int value;
};
int main()
{
Tnode* root;
return 0;
}
你定义了Tnode之后,就可以直接把Tnode 拿来用,而不需要加上 struct 这个关键字。
我想这也是c++的一个相对C来改进的地方。
(2)会到C语言,也许正式因为有这个不方便,才引入了typedef 的,所以很显然:typedef 必须是有两个名字的,type A B;
一般说来,A是比B更早存在的,所以:
typedef struct Tnode{
Tnode* left;
Tnode* right;
int value;
}Node;
int main()
{
Node *root;
return 0;
}
得出: struct Tnode = Node,所以用Node的时候就不用写成 struct TNode 了,方便很多。
所以,你非要用Tnode 的话,只能是struct Tnode * root了。
当然以上说的都是在C 语言中,而不是c++。
今天算是搞明白了很多,一直困惑着。
刚才提到,在C++ 中可不用这么麻烦,所以在c++中,是不用typedef的(其实我不确定),至少从结构体定义使用上来说是不需要的,因为已经很方便,但是,很显然的是,当我们真的想用一个自己喜欢的名字代替别的名字的时候,就会用到了,比如你想用简单的代替,例如:
typedef struct Tnode{
Tnode* left;
Tnode* right;
int value;
} A;
int main()
{
A *root; //这些写成 Tnode *root 也是可以的,这就是和C的区别,必须要加上struct。
}
所以,其实在C中,struct 之后的这个 叫结构标记,是可选的,一般说来 并不用,比如:
typedef struct {
int x;
int y;
} Point; 这就可以了,以后就可以直接用 Point。
之所有需要有个标记,其实是为了 自引用(我觉得这至少是一个原因),因为要是没这个标记,按照现在定义的顺序,怎么标记自己?
因为自己的名字Point 在最后才出现,之前是不能用的,所以前面多一个标记,就能让你自引用了。
所以,当你不需要自引用的时候,你就可以不用写 struct之后的结构标记,直接在后面写结构名,然后就可以直接用了。
看来c++ 做的确实把C中这一方面复杂的逻辑改进很多,呵呵。