目录
2021.8.26
结构体
结构体类型的声明
结构的基础知识
结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。
结构的声明
代码如下(示例):
struct tag
{
member-list;// 成员列表
}variable-list;// 变量列表
// 声明一个结构体类型
struct Stu
{
char name[20];// 姓名
char tele[12];// 电话
char sex[10];// 性别
int age;// 年龄
}s3,s4;// 必须加分号
struct Stu s2;// 全局变量
int main()
{
// 创建的结构体变量
struct Stu s1;
return 0;
}
匿名结构体
代码如下(示例):
// 如果这里没有tag,则说明我们创建的是一个匿名结构体,也就只能使用我们创建好的s了
struct
{
char name[20];// 姓名
char tele[12];// 电话
char sex[10];// 性别
int age;// 年龄
}s;
struct
{
char name[20];// 姓名
char tele[12];// 电话
char sex[10];// 性别
int age;// 年龄
}* ps;
int main()
{
ps = &s;// err,编译器会把上面两个声明当成完全不同的两个类型
return 0;
}
结构体的自引用
结构体自引用的错误方式:
代码如下(示例):
struct Node
{
int data;
struct Node next;
};
结构体自引用的正确方式:
代码如下(示例):
struct Node
{
int data;
struct Node* next;// 想用这种方式,则结构体不能匿名
};
// 结构体重命名
typedef struct Node
{
int data;
struct Node* next;// 想用这种方式,则结构体不能匿名
}Node;
结构体变量的定义和初始化
代码如下(示例):
struct T
{
double weight;
int age;// 年龄
};
struct Stu// 结构体定义
{
char name[10];// 姓名
struct T st;
double b;
char c;
};
int main()
{
struct Stu s = { "张三",{71.2 , 21}, 20.00,'t' };// 结构体初始化
printf("%s, %lf, %d, %lf, %c", s.name, s.st.weight, s.st.age, s.b, s.c);
return 0;
}
结构体内存对齐
结构体的对齐规则:
对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值,vs中默认值为8
-
第一个成员在与结构体变量偏移量为0的地址处。
-
其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处。