一.结构体
1.基本数据类型:
整形
浮点型
字符型
布尔型
枚举型
2.构造数据类型
数组
结构体
共用体
3.结构体数据类型定义
struct 结构体类型名
{
数据类型1 变量1
数据类型2 变量2
...
};
嵌套定义
struct A
{
struct A a;
int a;
}//无法实现
struct A
{
struct A *a;
}//可以实现
typedef 类型名 类型别名
typedef unsigned int size_t
4.结构体数据类型变量
定义:
struct 结构体类型名 变量名
struct student stu0,stu1;
struct student
{
...
}stu2,stu3;
初始化:
全部初始化
stu_t stu0 = {"zhangsan",'m',21,59.9};
datetime_dt dt0 = {{2023,11,8},{14,23,30}};
局部初始化
stu_t stu1 = {.sex = 'f',.age = 22};
访问:
可以通过结构体变量名加成员类型//stu0.name stu0.age
可以通过指针以结构体变量名加成员类型//(&stu0)->name
嵌套定义访问时//dt0.d.year dt0.t.hour
遇到指针类型成员变量用->,遇到普通成员变量用.
5.结构体内存对齐原则
结构体的成员变量分配在内存中的起始地址一定是自身基本数据类型所占字节的整数倍
32位数据线每次开辟空间时总会开辟4字节空间大小,因此char型,short型所占空间会向int型转变
64位系统下,如果存在double型,将以8字节对齐
结构体大小最终是结构体中最大数据变量所占字节的整数倍
#pragma pack()//括号内数字将使数据类型以多少字节对齐
6.结构体类型函数传参
补充:
如果函数定义的参数为void fun(struct student *stu)时,引用结构体内部的变量需要用到指针传递,即stu0->name,stu0->sex......,并且在调用函数时,需要传递一个地址名。