一、结构体的简单说明
结构是一些值的集合,这些值称为成员变量。结构的每个 成员可以是不同类型的变量。
1.1结构的声明
其中:tag为结构体的名字,member为该结构体中的成员,variable为结构体tag类型的变量。
例如:用结构体描述一个学生的基本信息。
struct stu
{
char name[20]; //名字
int age; //年龄
char sex[5]; //性别
char id[20]; //学号
};
1.2结构体的自引用
结构体的正确自引用:
struct Node
{
int data;
struct Node* next;
};
结构体重定义后的自引用:
typedef struct Node
{
int data;
struct Node* next;
}Node;
1.3结构体变量的定义和初始化
有了结构体类型,那么如何定义结构体变量呢,很简单,具体定义如下:
变量定义:
声明类型的同时定义变量p1
struct point
{
int x;
int y;
}p1;
单独定义结构体变量
struct point p2;
初始化:
定义变量的同时赋初值
struct Stu //类型声明
{
char name[15];//名字
int age; //年龄
};
struct Stu s = {"zhangsan", 20};//初始化
结构体嵌套初始化
struct Node
{
int data;
struct Point p;
struct Node* next;
}n1 = {10, {4,5}, NULL};
struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化
二、结构体内存对齐
上面我们已经简单介绍了结构体的基本使用,那么如何计算结构体在内存中的存储大小呢?我们继续往下探究。
首先我们举个例子:
#include<stdio.h>
struct S1
{
char c1;
int i;
char c2;
};
struct S2
{
char c1;
char c2;
int i;
};
int main()
{
printf("%d\n", sizeof(struct S1));
printf("%d\n", sizeof(struct S2));
return 0;
}
其中S1,S2成员中有两个char类型,一个int 类型,那么结构体大小应该都是4+1+1=6??
真是这样嘛?让我们来看看程序跑出来的结果。
为什么会是8和12??而且S1和S2的结构体大小不同?那么这就涉及到结构体内存对齐的知识了。
2.1结构体内存对齐的规则:
1.第一个成员在与结构体变量偏移量为0的地址处。
2.从第二个开始,其他成员变量要对其到(对齐数)的整数倍的地址处。
对齐数=编译器默认对齐数与该成员大小的较小值。
3.结构体总大小为最大对齐数(每个成员都有一个对齐数)的整数倍。
4.如果嵌套结构体,嵌套的结构体对齐到自己最大对齐数的整数倍处,结构体的整体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍。
2.2内存对齐规则的实例分析
嵌套情况:
三、总结
通过这次结构体的学习,对于结构体的基本使用和编写已经熟练了许多,了解到了结构体在内存的对齐规则,怎么去计算结构体的大小。以及知道了结构体在内存的存储规则。对于结构体的实际代码应用还有待提高,后续通过编写有关代码来实际动手操作来对于结构体更加深刻。