17.结构体(typedef)
1.结构体
a、结构体类型定义
b、结构体变量定义
c、结构体变量的初始化
d、typedef改类型名
e、点运算符和指针法操作结构体
f、结构体也是一种数据类型,复合类型,自定义类型
2.结构体变量的定义
(1).先定义类型,再定义变量(常用)
struct Teacher t1; //全局变量
(2).定义类型同时定义变量
struct Teacher2 { char name[50]; int age; }t3 = {"tom", 66}; struct { char name[50]; int age; }t5;
3.结构体变量的初始化
定义变量时直接初始化,通过{}
struct Teacher t7 = { "lily", 18 };
4.typedef改类型名
typedef struct Teacher3 { char name[50]; int age; }Teacher3; struct Teacher3 t8; Teacher3 t9;
5.定义结构体指针
使用是要先分配空间,再使用;
6.结构体数组
7.结构体嵌套一级指针
8.结构体嵌套二级指针
9.结构体做函数参数
10.结构体深拷贝和浅拷贝
(1).结构体浅拷贝
结构体中嵌套指针,而且动态分配空间;
同类型结构体变量赋值;
不同结构体成员指针变量指向同一块内存;
Teacher t1; //定义结构体变量 t1.name = (char *)malloc(30); strcpy(t1.name,"mike"); t1.age = 22; Teacher t2; //结构体变量 t2 = t1; printf("[t2]%s,%d\n",t2.name,t2.age); if(t1,name != NULL) { free(t1.name); t1.name = NULL; //t1,t2指向同一块动态分配的内存,只要释放一次 }
(2).深拷贝(人为增加内容,重新拷贝)
Teacher t1; //定义结构体变量 t1.name = (char *)malloc(30); strcpy(t1.name,"mike"); t1.age = 22; Teacher t2; //结构体变量 t2 = t1; t2.name = (char *)malloc(30); //重新增加内容 printf("[t2]%s,%d\n",t2.name,t2.age); if(t1.name != NULL) { free(t1.name); t1.name = NULL; } if(t2.anme != NULL) { free(t2.name ); t2.name = NULL; //t1,t2不是指向同一块内存 }
11.结构体字节对齐
原则1:数据成员的对齐规则(以最大的类型字节为单位)。
结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存放在offset为该数据成员大小的整数倍的地方(比如int在32位机为4字节,则要从4的整数倍地址开始存储)
原则2:结构体作为成员的对齐规则。
如果一个结构体B里嵌套另一个结构体A,则结构体A应从offset为A内部最大成员的整数倍的地方开始存储。(struct B里存有struct A,A里有char,int,double等成员,那A应该从8的整数倍开始存储。),结构体A中的成员的对齐规则仍满足原则1、原则2。
注意:
1. 结构体A所占的大小为该结构体成员内部最大元素的整数倍,不足补齐。
2. 不是直接将结构体A的成员直接移动到结构体B中
原则3:收尾工作
结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。