17.结构体(typedef)

时间:2023-01-19 21:00:38

1.结构体

a、结构体类型定义
b、结构体变量定义
c、结构体变量的初始化
d、typedef改类型名
e、点运算符和指针法操作结构体
f、结构体也是一种数据类型,复合类型,自定义类型

2.结构体变量的定义

(1).先定义类型,再定义变量(常用)

struct Teacher t1; //全局变量

(2).定义类型同时定义变量

struct Teacher2
{
char name[];
int age;
}t3 = {"tom", }; struct
{
char name[];
int age;
}t5;

3.结构体变量的初始化

定义变量时直接初始化,通过{}

struct Teacher t7 = { "lily",  };

4.typedef改类型名

typedef struct Teacher3
{
char name[];
int age;
}Teacher3; struct Teacher3 t8;
Teacher3 t9;

5.定义结构体指针

使用是要先分配空间,再使用;

6.结构体数组

7.结构体嵌套一级指针

8.结构体嵌套二级指针

9.结构体做函数参数

10.结构体深拷贝和浅拷贝

(1).结构体浅拷贝

结构体中嵌套指针,而且动态分配空间;

同类型结构体变量赋值;

不同结构体成员指针变量指向同一块内存;

Teacher t1;      //定义结构体变量
t1.name = (char *)malloc();
strcpy(t1.name,"mike");
t1.age = ;
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();
strcpy(t1.name,"mike");
t1.age = ;
Teacher t2; //结构体变量
t2 = t1;
t2.name = (char *)malloc(); //重新增加内容
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的结果,必须是其内部最大成员的整数倍,不足的要补齐。