目录
本小节重点:
结构体类型的声明
结构的自引用
结构体变量的定义和初始化
结构体内存对齐
结构体传参
结构体实现位段(位段的填充&可移植性)
1 结构体的声明
1.1 结构的基础知识
定义:结构体是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
1.2 结构的声明
struct tag
{
member-list;
}variable-list;
示例:描述一个学生信息
struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
}; //注意:分号不能丢
1.3 特殊的声明
在声明结构的时候,可以不完全的声明。
//匿名结构体类型
struct
{
int a;
char b;
float c;
}x;
struct
{
int a;
char b;
float c;
}a[20], *p;
上面的两个结构在声明的时候省略掉了结构体标签(tag)。
那么在上面代码的基础上,下面的代码合法吗?
p = &x;
答案是:是非法的,编译器会把上面的两个声明当成完全不同的两个类型。
1.4 结构的自引用
在结构中包含一个类型为该结构本身的成员是否可以呢?
代码1
struct Node
{
int data;
struct Node next;
};
//可行否?
如果可以,那sizeof(struct Node)是多少?
代码1分析:不可以这样自引用
正确的结构体自引用方式:
struct Node
{
int data;
struct Node* next;
};
1.5 结构体变量的定义和初始化
1. 结构体变量定义和初始化的几种方式
声明类型的同时定义变量p1/定义结构体变量p2/定义变量的时候同时赋值
代码1
struct Point
{
int x;
int y;
}p1; //声明类型的同时定义变量p1 这里定义的变量都是全局变量
//初始化:定义变量的同时赋初值。
struct Point p3 = {
1, 2 };
int main()
{
struct Point p2;//定义结构体变量p2 这里定义的是局部变量
return