结构体与共用体
结构体的定义
引例
比如学生是一个整体,学生有姓名、性别、学号……我们更希望把一个事物整体的操作
自定义数据类型
- 基础数据类型是电脑定义好了的,默认的数据类型
- 自定义数据类型意义:需要我们采用编译器提供的已经有的最小内存操作单元,按照我们自己的业务组合而成的。所以有了结构体和共用体
-
- 结构体是组合累加的概念(用的最多)
- 共用体是共享基地址的概念
结构体的语法
- struct结构体名== 可以认为与int等价
使用结构体要先定义再使用:创造出结构体名后,需要告诉编译器,组合方式,后面编译器看到这个类型,就知道该如何管理内存了
struct stu{
int a1; //成员变量
int b2; // 每个元素都是基础数据类型
double c3;//然后组成了我们自定义的空间
};
/*后续使用*/
struct stu abc;
结构体的使用
#include<stdio.h>
#include<string.h>
struct stu
{
int age;
char name[16];
};
int main()
{
int a1;
struct stu s1;
s1.age = 10;
strcpy(s1.name,"hello");
printf("the student's age is %d and name is %s ",s1.age,s1.name);
}
将上面的代码修改一下
void my_inf(const struct stu *data)
{
printf("the student's age is %d and name is %s ",data->age,data->name);
}
int main()
{
int a1;
struct stu s1;
s1.age = 10;
strcpy(s1.name,"hello");
my_inf(&s1);
}
函数调用里形参是传递一个指针而不是传递一个空间,
因为你已经建立的一个结构体,你在把他传递到函数里,相当于你开辟了两个空间,这样会造成浪费空间,所以只需要把空间的地址传递给函数即可
结构体字节对齐
struct stu
{
int age;
char name[16];
};
int main()
{
struct stu s1;
printf("sizeof=%d", sizeof(struct stu));
}
空间是一个累加的过程
当我们把减少结构体里的char类型的空间,然而结构体所占的字节依然是20
struct stu
{
int age;
char name[15];
};
int main()
{
struct stu s1;
printf("sizeof=%d", sizeof(struct stu));
}
结构体的空间大小
- 结构体为了保证CPU访问效率,默认采用内存对齐机制
- 对齐标准为结构体中基础数据类型的成员的最大值
上面int是四个字节作为一个基准而char[15]能占15个字节吗?
不行,必须是4的倍数
成员顺序有没有关系呢?
struct stu
{
char a1;
int age;
short b2;
};
int main()
{
struct stu s1;
printf("sizeof=%d", sizeof(struct stu));
}
当我们调整一下顺序
struct stu
{
char a1;
short a2;
int a3;
};
共用体的定义
把上面的struct 换成union
如图,共用体里面的每一个元素公用首地址
union stu
{
char a1;
short b2;
int age;
};
int main()
{
union stu s1;
printf("sizeof=%d", sizeof(union stu));
}
union stu
{
char a1;
short b2;
int age;
};
int main()
{
union stu s1;
memset(&s1,0, sizeof(s1)); //初始化空间全部为0
printf("sizeof=%d\n", sizeof(union stu));
s1.a1='1'; //1的ASC表上对应16进制为31
printf("the age is %x",s1.age);
}