这里写目录标题
结构体
结构体是不同类型值的集合,这些值称为成员变量,结构的每个成员可以是不同类型的变量
结构体和其他类型基础数据类型一样,例如 int类型、char类型
只不过结构体可以自定义数据类型进行复杂对象的描述就会使用到结构体
结构体声明
结构体声明的语法形式:
方法一:
struct book
{
char a[20];
char b[15]; 成员列表
int c;
};
int main()
{
struct book t;
}
- 这里struct 是一个结构体关键字,book 是结构体标签,可以更改
- 里面的就是成员变量,可以定义不同类型
- 最后 { } 后还有 :
- struct book 就是结构体类型
t 就是用结构体类型创建的变量
方法二:
struct book
{
char name[20];
char id[15]; 成员列表
int price;
}s1,s2,s3;
- 在创建结构体类型的同时,创建变量
- 方法二 创建的变量是
全局变量
,
方法一 的是局部变量
特殊的结构体声明
struct
{
int a;
char b;
float c;
}s;
- 声明结构体时,可以不完全的声明,类似于数组的不完全初始化
省略掉了结构体的名称(标签) - 这种结构体声明叫
匿名结构类型
,但是只能用一次
例题:
如果二种匿名结构类型的成员相同,类型是否相同?
struct
{
int a;
char b;
float c;
}s;
struct
{
int a;
char b;
float c;
}*pd;3
int main()
{
*pd = s;
二种类型是否相等?
}
- 上面的成员类型虽然都是一样的
如果强行使用,不会出现太大的问题
但是编译器会认为这是二种类型,所以是非法的
结构体自引用
- 一个结构体类型里是可以包含另一过结构体类型作为它的成员,但是应该正确的使用
下面是错误的示范
struct G
{
int f;
struct G;
};
int main()
{
struct G s;
}
这种想想都知道是不可以运行的了,无限循环,因为如果要计算结构体的大小,那大小是多少
正确的自引用方式:
struct Node
{
struct Node* next;
};
- 正确的自引用是包含同类型的结构体指针
- 一般是用来实现链表(不太懂没关系,我也没学到)
是否可以用匿名结构体
进行结构体自引用?
- 结构体类型是无法通过结构体自身变量进行自引用,只能通过自身类型进行引用
- 因为匿名结构体只能用一次
是否可以用 typedef 进行类型重命名后,进行结构体自引用?
typedef struct
{
int data