一、结构体的定义
//不分配内存
当需要不同类型的数据来构成一个整体时就需要用到结构体。
结构体内部的元素,也就是组成成分,一把称为"成员"。
注:结构体只有属性,没有方法
结构体一般定义形式1:
struct 结构体名 {
类型名1
成员名1;
类型名2
成员名2;
.....
类型名n
成员名n;
};
//定义结构体变量名,这时候分配内存
struct 结构体名
结构体变量名;
结构体一般定义形式2:
struct 结构体名 {
类型名1
成员名1;
类型名2
成员名2;
.....
类型名n
成员名n;
}
结构体变量名;
结构体一般定义形式3:
//没有结构体名
struct {
类型名1 成员名1;
类型名2 成员名2;
.....
类型名n 成员名n;
} 结构体变量名;
注意:
1、结构体不允许对结构体本省进行递归。
例如
struct Student {
int age ;
struct Student stu;
}; //错误做法
2、结构体可以包含别热结构体
例如
struct Gun {
int bulletCount;
int range;
}
struct weapon{
char *name;
struct Gun handGun;
};
3、结构体初始化
//正确地做法
struct 结构体名 变量 = {成员1的值,... ,成员n的值};
//错误的做法
struct 结构体名 变量;
变量 = {成员1的值,... ,成员n的值};
二、结构体数组
定义形式一:
struct 结构体名 {
类型名1 成员名1;
类型名2 成员名2;
.....
类型名n 成员名n;
};
struct 结构体名 结构体数组名[n];
定义形式二:
struct 结构体名 {
类型名1 成员名1;
类型名2 成员名2;
} 结构体数组名[n];
定义形式三:
struct {
类型名1 成员名1;
类型名2 成员名2;
} 结构体数组名[n];
三、结构体作为函数参数
将结构体变量作为函数参数传递时,其实传递的是全部成员的值,也就是就爱那个实参中成员得知一一赋值给对应的形参成员。因此形参的改变不会影响到实参。
四、指向结构体的指针
* 每个结构体都有自己的存储空间和地址,因此指针也可以指向结构体变量
* 结构体指针变量定义形式:struct 结构体名 *指针变量名;
* 有了指向结构体的指针,那么就有三种访问结构体成员的方式:
- 结构体变量名.成员名;
- (*指针变量名).成员名;
- 指针变量名-> 成员名;
五、结构体指针作为函数参数
将结构体指针变量作为函数参数传递时,传递的是指针指向的结构体变量的地址,因此会改变实参的值。