C结构体总结
结构体是一种构造类型,所谓构造类型即由基本类型(整型、字符型等)组合而成。结构体不同于数组,前者可以存放不同类型的数据,而后者只能存放相同类型的数据。
结构体类型的定义如下
struct 结构体名
{
类型1 成员1;
类型2 成员2;
...
类型n 成员n;
};
需要特别注意一下几点:
(1)末尾花括号后面的分号不可缺少
(2)结构体中的成员名可以和程序中其他变量同名,互不干扰
(3)使用结构体类型时,“struct 结构体名”作为一个整体 表示某种特定的结构体类型
(4)结构体类型的成员可以是基本数据类型,也可以是已经定义的结构体类型。也即,结构体的定义可以嵌套,但嵌套的结构体类型必须是已经定义好的
例如
struct date
{
int year;
int month;
int day;
};
struct stu
{
char id[10];
char name[10];
int score;
struct date birthday; //嵌套定义
};
结构体成员的引用使用成员操作符”.”,格式为 结构体变量名.成员名,特别注意:
(1)结构体变量不能整体输入输出,只能以成员作为基本变量逐个操作
(2)同种类型的结构体变量可以直接赋值,其实是各成员逐个赋值
(3)嵌套结构体变量的引用使用成员操作符逐级访问,比如student.birthday.year;
结构体指针和数组
struct stu
{
char name[10];
int score;
}student[3], *pStu; //定义了结构体数组student[3]和结构体指针pStu
需要注意的是,结构体变量名不同于数组名,并不代表该结构体的首地址。
使用结构体指针访问它所指向结构体变量的成员,可以使用(*pStu).name
或者pStu->name
(NOTE:箭头操作符“->”访问结构体成员仅限于结构体指针,而不是结构体变量,如student[0]->name
是错误的)
链表
C常使用结构体构造链表,链表由一系列结点组成,每个结点包括数据域和指针域两部分。其中数据域存储数据元素,指针域存储下一个结点的内存地址。链表的内容还是比较好理解的,在数据结构里介绍的非常详细,这里仅以单链表为例总结一下结构体在链表中的使用和常见误区。
typedef struct node
{
int data;
struct node *next;
} Node, *pNode;
上面这种类型重定义在数据结构中比较常见,等价于
struct node
{
int data;
struct node *next;
};
typedef struct node Node;
typedef struct node *pNode;
这样,以后便可以用Node定义struct node型结构体变量,用pNode定义struct node*型结构体指针。
另外,需要注意链表中头结点和头指针的区别。以上面定义的struct node类型结构体为例,头结点的类型是struct node,包含数据域和指针域;头指针的类型是struct node*,仅仅是指向struct node型结构的指针,没有数据域和指针域之说。