结构体变量定义方法多样,统计一下
直接定义"结构体变量"
——如果结构体只在局部使用(函数或.c文件),则可直接定义变量
struct person{
char name[8];
int age;
} p1;
先定义"结构体类型",再利用"结构体类型"名定义"变量"
——主要是为了重用该数据类型,有时候还用typedef重命名一个结构体。目的:如果某个结构体变量很常用,多个文件共用,就该先定义结构体类型,然后在不同的文件里定义变量。
struct person{
char name[8];
int age;
} ;
struct person p1,p2;
直接定义无类型名的结构体变量
——一般用在函数内部
struct {
char name[8];
int age;
} p1,p2;
因为用完即弃,没必要写类型名了。
嵌入式C语言中,常见例子
typedef重命名数据结构类型
- typedef struct cola
- {
- intiNum;
- } coco-cola,pesi-cola;
把结构体类型cola重命名为coco-cola,pesicola.
嵌入式链表例子
typedef struct _link_node
{
element_type data;
struct _link_node *next;
} link_node;
typedef link_node *link_list;
/* 不等价于:typedef struct link_node *link_list; 多了个struct相当于重新声明一个结构体,和link_node类型无关。如果混淆会报错
*bst.c:19: error: dereferencing pointer to incomplete type
*参考http://blog.csdn.net/xzongyuan/article/details/21597471
*表明link_list是一个指针类型,link_list声明的数据都是指针。
*例如:link_list *list;
*不等价于struct link_node *link_list; 这是声明一个link_list变量,仅仅
*是变量,不是自定义类型。
*typedef的作用就是通过重命名方式,把link_list定义为“指针类型”
*/
注意_link_node成员变量,它必须是指针类型的,如果是结构体类型,会造成结
构体递归嵌套,形成无穷大的结构体,这是不允许的。
上面两个typedef,第一个重名了结构体_link_node,第二个重名了“指针类型”
(要区分指针类型和指针变量的区别)link_list。这样做主要是考虑了可移植性。
用typedef定义了link_list类型后,就可以声明一个指针变量了:
link_list *list;
理解了原理后,上面两个代码可以让结构体类型和结构体指针类型一起定义
typedef struct _link_node{
} link_node;
typedef link_node *link_list;
/* 不等价于:typedef struct link_node *link_list; 多了个struct相当于重新声明一个结构体,和link_node类型无关。如果混淆会报错
*bst.c:19: error: dereferencing pointer to incomplete type
*参考http://blog.csdn.net/xzongyuan/article/details/21597471
*表明link_list是一个指针类型,link_list声明的数据都是指针。
*例如:link_list *list;
*不等价于struct link_node *link_list; 这是声明一个link_list变量,仅仅
*是变量,不是自定义类型。
*typedef的作用就是通过重命名方式,把link_list定义为“指针类型”
*/
注意_link_node成员变量,它必须是指针类型的,如果是结构体类型,会造成结
构体递归嵌套,形成无穷大的结构体,这是不允许的。
上面两个typedef,第一个重名了结构体_link_node,第二个重名了“指针类型”
(要区分指针类型和指针变量的区别)link_list。这样做主要是考虑了可移植性。
用typedef定义了link_list类型后,就可以声明一个指针变量了:
link_list *list;
理解了原理后,上面两个代码可以让结构体类型和结构体指针类型一起定义
typedef struct _link_node{
element_type data;
struct _link_node *next;
} link_node,*link_list;
参考http://zhidao.baidu.com/link?url=-Et99w3FLLhpKxgNooE9gtsk48ERX88Uknfa4gh3su37s9fCG_IDWoBXpRVUAdbYOO435ZfdI_qHQiZTh4xab_
一个双向链表的结构体定义。typedef struct node *link;
先预声明 Link 为指向一个结构的指针类型,所有Link 定义的便量都是指针,并
且是指向一个结构的指针;
struct node{ int elem; link left; link right; }Node;结构体定义,同时定
义了一个结构体变量Node;
还可以换个方式更直观些
} link_node,*link_list;
参考http://zhidao.baidu.com/link?url=-Et99w3FLLhpKxgNooE9gtsk48ERX88Uknfa4gh3su37s9fCG_IDWoBXpRVUAdbYOO435ZfdI_qHQiZTh4xab_
一个双向链表的结构体定义。typedef struct node *link;
先预声明 Link 为指向一个结构的指针类型,所有Link 定义的便量都是指针,并
且是指向一个结构的指针;
struct node{ int elem; link left; link right; }Node;结构体定义,同时定
义了一个结构体变量Node;
还可以换个方式更直观些
typedef struct node
{
int elem;
struct node *left;
struct node *right; }S_Node;
struct node *left;
struct node *right; }S_Node;
程序中用S_Node Node;来定义一个节点,或者
S_Node *pNode;来定义一个指向节点的指针,再用内存申请生成节点
创建结构体单链表的例子
http://blog.csdn.net/xzongyuan/article/details/21375449
有了上面的知识,再去理解单链表初始化就容易了。
S_Node *pNode;来定义一个指向节点的指针,再用内存申请生成节点
创建结构体单链表的例子
http://blog.csdn.net/xzongyuan/article/details/21375449
有了上面的知识,再去理解单链表初始化就容易了。
构建二叉树的例子
http://blog.csdn.net/xzongyuan/article/details/21389195