user-0 提问: 结构体的声明和实例化

回复:
user: user-1
content: 谢谢各位，学习了

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:typedef struct BiTnode {     int key_value;     struct BiTnode *left,*right; }BiTnode, *BSTree; //以上定义了两个类型别名BiTnode和BSTree： //BiTnode代表struct BiTnode //BSTree代表struct BiTnode *  int Insert_key ( BSTree *root, int key ) //以上定义一个函数Insert_key，返回值为int，第一个参数root的类型为BSTree *，即struct BiTnode ** {     BiTnode *father = NULL, *p = *root, *s; //以上声明一个变量father，其类型为BiTnode *，即struct BiTnode *，并初始化其值为NULL， //接着声明一个变量p，其类型同上，并初始化其值为*root，因为root的类型为BSTree *，即struct BiTnode **，所以*root的类型为struct BiTnode * //接着声明一个变量s，其类型同上  //上面蓝色的BiTnode和红色的BiTnode虽然长得一样， //但BiTnode是标记（tag）。参考语法struct [tag] { member-list } [declarators]; //而BiTnode是别名（synonym）。参考语法typedef type-declaration synonym; //语法规定和编译器实现允许tag和synonym长一样，不会弄混。     谢谢老师详细解答，短短几行代码里面包含了这么多知识点，谢谢^_^

user: user-0
content: 引用 9 楼 paschen 的回复:[quote=引用 7 楼 ouwei33 的回复:] [quote=引用 3 楼 paschen 的回复:] 你说的：请问这里BStree为什么可以作为一种指针类型？Bstree在上面看来不是一个指针的实例吗？  BSTree不是实例，你前面有个typedef，是指定一个别名而已，如果没有才是在声明对象  但是这里有个问题，为什么这里还要特意定义一个*bittree的指针呢？ 如果不定义这个*bittree的话直接默认用bitnode* 不是也可以吗？难道是为了少写一个*，所以特意定义一个*bittree？[/quote]  是可以，仅一个别名而已[/quote]  谢谢

user: user-2
content: 也可以更有可有可读性，你皇他指针类型用的名字是Tree

user: user-2
content: 引用 7 楼 ouwei33 的回复:[quote=引用 3 楼 paschen 的回复:] 你说的：请问这里BStree为什么可以作为一种指针类型？Bstree在上面看来不是一个指针的实例吗？  BSTree不是实例，你前面有个typedef，是指定一个别名而已，如果没有才是在声明对象  但是这里有个问题，为什么这里还要特意定义一个*bittree的指针呢？ 如果不定义这个*bittree的话直接默认用bitnode* 不是也可以吗？难道是为了少写一个*，所以特意定义一个*bittree？[/quote]  是可以，仅一个别名而已

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:typedef struct BiTnode {     int key_value;     struct BiTnode *left,*right; }BiTnode, *BSTree; //以上定义了两个类型别名BiTnode和BSTree： //BiTnode代表struct BiTnode //BSTree代表struct BiTnode *  int Insert_key ( BSTree *root, int key ) //以上定义一个函数Insert_key，返回值为int，第一个参数root的类型为BSTree *，即struct BiTnode ** {     BiTnode *father = NULL, *p = *root, *s; //以上声明一个变量father，其类型为BiTnode *，即struct BiTnode *，并初始化其值为NULL， //接着声明一个变量p，其类型同上，并初始化其值为*root，因为root的类型为BSTree *，即struct BiTnode **，所以*root的类型为struct BiTnode * //接着声明一个变量s，其类型同上  //上面蓝色的BiTnode和红色的BiTnode虽然长得一样， //但BiTnode是标记（tag）。参考语法struct [tag] { member-list } [declarators]; //而BiTnode是别名（synonym）。参考语法typedef type-declaration synonym; //语法规定和编译器实现允许tag和synonym长一样，不会弄混。    谢谢，很详细的解释，学习了

user: user-0
content: 引用 3 楼 paschen 的回复:你说的：请问这里BStree为什么可以作为一种指针类型？Bstree在上面看来不是一个指针的实例吗？  BSTree不是实例，你前面有个typedef，是指定一个别名而已，如果没有才是在声明对象  但是这里有个问题，为什么这里还要特意定义一个*bittree的指针呢？ 如果不定义这个*bittree的话直接默认用bitnode* 不是也可以吗？难道是为了少写一个*，所以特意定义一个*bittree？

user: user-3
content: typedef struct BiTnode {     int key_value;     struct BiTnode *left,*right; }BiTnode, *BSTree; //以上定义了两个类型别名BiTnode和BSTree： //BiTnode代表struct BiTnode //BSTree代表struct BiTnode *  int Insert_key ( BSTree *root, int key ) //以上定义一个函数Insert_key，返回值为int，第一个参数root的类型为BSTree *，即struct BiTnode ** {     BiTnode *father = NULL, *p = *root, *s; //以上声明一个变量father，其类型为BiTnode *，即struct BiTnode *，并初始化其值为NULL， //接着声明一个变量p，其类型同上，并初始化其值为*root，因为root的类型为BSTree *，即struct BiTnode **，所以*root的类型为struct BiTnode * //接着声明一个变量s，其类型同上  //上面蓝色的BiTnode和红色的BiTnode虽然长得一样， //但BiTnode是标记（tag）。参考语法struct [tag] { member-list } [declarators]; //而BiTnode是别名（synonym）。参考语法typedef type-declaration synonym; //语法规定和编译器实现允许tag和synonym长一样，不会弄混。

user: user-0
content: 引用 3 楼 paschen 的回复:你说的：请问这里BStree为什么可以作为一种指针类型？Bstree在上面看来不是一个指针的实例吗？  BSTree不是实例，你前面有个typedef，是指定一个别名而已，如果没有才是在声明对象  噢，原来我把结构体声明和新建数据类型搞混了 这里确实有个typedef，这样的话就是在新建一种数据类型了，所以这里的bitnode和bittree都是数据类型，而不是实例 非常感谢

user: user-0
content: 引用 2 楼 paschen 的回复:Bitnode*  等于 BSTree  谢谢了，原来是bittree不是一个实例，而是一种类型，这下就容易理解了，非常感谢^_^

user: user-2
content: 你说的：请问这里BStree为什么可以作为一种指针类型？Bstree在上面看来不是一个指针的实例吗？  BSTree不是实例，你前面有个typedef，是指定一个别名而已，如果没有才是在声明对象

user: user-2
content: Bitnode*  等于 BSTree

user: user-2
content: BiTnode就代表这个结构体，BSTree代表这个结构体的指针类型  查以用typedef取别名