结构体(struct)
将一组不同类型的元素定义在一起,且以struct声明,就是结构体。
|
|
定义
不允许对结构体本身递归定义
如下定义是错误的,
1234truct Student {int age;struct Student stu; //error};
结构体内可以包含别的结构体
结构体变量占用的内存空间是其成员所占内存之和,而且各成员在内存中按定义的顺序依次排列
三种结构体变量定义形式
- 先定义结构体类型,再定义变量
|
|
- 结构体类型与变量同时定义
|
|
- 省略类型,结构体变量名为stu
|
|
在定义变量的位置,是可以定义多个变量的:
|
|
初始化
先定义,后初始化
12345678struct Person {char name[20];int age;float weight;};int main() {struct Person person = {"a", 28, 55.5f};}
定义时,并初始化
12345struct Person {char name[20];int age;float weight;} person = {"a", 28, 55.5f};
初始化的时候,可以按顺序赋值一些变量,而不全部赋值,与数组类似
1234567 > > struct Person {> > char name[20];> > int age;> > float weight;> > } person = {"a", 28};> >>
不能在初始时,先声明变量,再初始化
如下,是错误的
12struct Person person;person = {"a", 28, 55.5f}; //error
使用
以 “变量名.属性”来使用
|
|
结构体中, 若以
char name[20];
字符数组形式声明: 不能直接用person.name = "name";
来赋值。要以
strcpy(person.name, "name");
这样的形式来赋值。若声明成
char *name;
则不会有这样的问题
结构体数组
跟结构体变量一样,结构体数组也有3种定义方式
初始化与数组类似 struct Person person = { {}, {}, {} }
|
|
结构体作为函数参数
值传递: 将结构体变量作为函数参数进行传递时,其实传递的是全部成员的值,也就是将实参中成员的值一一赋值给对应的形参成员。因此,形参的改变不会影响到实参。
指向结构体的指针
结构体指针变量的定义形式:struct 结构体名称 *指针变量名
,如:
|
|
有了指向结构体的指针,那么就有3种访问结构体成员的方式:
|
|
结构体链表
静态链表
|
|
动态链表
|
|