1.结构体声明
struct tag
{
member-list;
}variable-list;
strust tag 结构体类型
member 成员类型
variable-list 声明类型并定义变量
举个栗子:
typedef struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
}Stu;//分号不能丢
2.结构体自引用
//错误示范!!!
struct Node
{
int data;
struct Node next;
};
因为struct Node 中不知道 struct Node next 包含内容的大小
所以正确的方法应该放入下一个结构体地址
struct Node
{
int data;
struct Node* next;
};
本章重点!!!
3.结构体内存对齐!!!
struct S1
{
char c1;
int i;
char c2;
};
printf("%d\n", sizeof(struct S1));
首先做题方法
画图解析
首先 c1 是 char类型 占一个字节
i 是 int 类型 占四个字节
为什么 i 要从 第四个字节开始呢,回到前面做题方法的第二条
从第二个成员开始,要对齐到某个对齐数的整数倍的偏移处
对齐数 :结构体成员自身大小和默认对齐数的最小值
vs:8 linux环境不设对齐数
什么意思呢?
例如上题 第二个成员是 int ,自身大小是4 ,在vs中对齐数是8, 取最小值就是4
然后 4的整数倍最小是4 ,所以 int i 就要从第四个字节开始, 前面的三个字节就被浪费了
最后 结构体总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍
不够的要记得向后扩展!
如果 结构体中嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍处,结构体的整 体大小就是所有最大对齐数(含嵌套结构体的对齐数)的整数倍
例如:
struct s4 中 嵌套了 s3 ,s3 最大对齐数是8 ,所以 s3 从第八个字节往后数16个
最后结构体的大小是所有最大对齐数(含嵌套结构体的对齐数)的整数倍!
4.修改默认对齐数
#include <stdio.h>
#pragma pack(8)//设置默认对齐数为8
struct S1
{
char c1;
int i;
char c2;
};
#pragma pack()//取消设置的默认对齐数,还原为默认
#pragma pack(对齐数)
#pragma pack 还原默认
5.结构体传参
struct S
{
int data[1000];
int num;
};
struct S s = {{1,2,3,4}, 1000};
//结构体传参
void print1(struct S s)
{
printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
printf("%d\n", ps->num);
}
int main()
{
print1(s); //传结构体
print2(&s); //传地址
return 0;
}
两种方法都能实现传参
但是推荐第二种 传地址
原因: