1.结构体的声明:
struct tag
{
member-list;
}variable-list;
我们首先试着了解一下什么是结构体,struct为自定义的基本类型,它是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。tag是该结构体的标签。member-list 是标准的变量定义,比如 int i; 或者 float f;,或者其他有效的变量定义。variable-list 结构变量,定义在结构的末尾,最后一个分号之前,您可以指定一个或多个结构变量。
看完上面的结构体声明,我们尝试着自己写定义一个结构体
struct Stu
{
char name[20];
int age;
char sex[5];
char id[20];
}; //这个分号是自带的,是结构体结束的标志!
//结构体中可以定义不同种类型的变量。
还有一种结构体是比较特殊的,它的struct 后面没有定义标签,我们把这种类型的结构体称为匿名结构体
2.匿名结构体
比如:
struct
{
int a;
char b;
float c;
}x;
struct
{
int a;
char b;
float c;
}a[20], *p;
所谓的匿名就结构体就是在struct 后面省略了tag,这个}后面的s,即为这个匿名结构体的变量。
如果在以上代码的基础上,下面的代码合法吗?
p=&x;
这个样子是不可以的哦。因为编译器会把上面的两个声明当成完全不同的两个类型。
3.结构体的自引用
struct Node
{
int data;
struct Node next;
};
这个样子是可以的吗?
用事实说话,这个样子是不可以的,因为,next并是
4.结构体的初始化
结构体的初始化其实非常的容易我来举一个例子
struct Point //定义一个结构体
{
int x;
int y;
}p1; //声明类型的同时定义变量p1
struct Point p2; //定义结构体变量p2
//初始化:定义变量的同时赋初值。
struct Point p3 = {x, y};
struct Stu //类型声明
{
char name[15];//名字
int age; //年龄
};
struct Stu s = {"zhangsan", 18};//初始化
这就是结构体的初始化!
结构体也可以嵌套结构体
例如:
struct Node
{
int data;
struct Point p;
struct Node* next;
}n1 = {10, {4,5}, NULL}; //结构体嵌套初始化,把指针定义为一个空指针!
struct Node n2 = {20, {5, 6}, NULL};//结构体嵌套初始化
5.结构体内存对齐
struct S1
{
char c1;
int i;
char c2;
};
我们来看一下运行结果————
也许很多小伙伴们都很不理解,我们知道int型变量为四个字节,char类型占一个字节,shout类型占2个字节等,为啥回是12个字节呢,这就涉及到了结构体对齐规则的问题了,我们来看一下啊结构体的规则问题!
结构体的规则
![](https://i-blog.csdnimg.cn/blog_migrate/1ef8e59eccca9f26a23d059a6e91c526.png)
如图即为对齐的原理!
我们了解完大概原理后,会想到,为什么会存在这种内存对齐呢?
大部分参考资料上说:
struct S1
{
char c1;
int i;
char c2;
};
struct S2
{
char c1;
char c2;
int i;
};
让占用空间小的成员尽量集中在一起