C语言自定义类型梳理
很久没有更新自己的博客了,有些生疏。这一段时间,虽然博客停更了,但我仍在继续学习,今天呢,想和大家介绍一下C语言中的自定义类型
结构体
一.什么是结构体?
在生活中,很多的复杂对象无法用C语言的某一种数据类型来描述,比如一个学生它有自己的名字,性别,年龄。这些信息我们无法用某一种基本数据类型来描述,那么我们可以用结构体将这些信息整合到一起。比如这样:
struct student
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
};//注意千万不能少分号
这样我们就成功声明了一个结构体。
二.如何访问结构体成员呢?
一般有如下两种访问方式:
1.我们可以用结构体访问符号(.),成员访问运算符是结构变量名称和我们要访问的结构成员之间的一个句号。我们来看看下面的示例。
#include <stdio.h>
#include <string.h>
struct student
{
char name[20];
int age;
char sex[5];
};
int main()
{
struct student s1;
strcpy(s1.name, "张三");
s1.age = 18;
strcpy(s1.sex, "男");
printf("%s\t%d\t%s\n", s1.name, s1.age, s1.sex);
return 0;
}
运行结果如下:
2.我们还可以用指向结构的结构指针来访问结构体成员。示例如下:
#include <stdio.h>
#include <string.h>
struct student
{
char name[20];
int age;
char sex[5];
};
int main()
{
struct student s1;
struct student* p = &s1;
strcpy(p->name, "张三");
p->age = 18;
strcpy(p->sex, "男");
printf("%s\t%d\t%s\n", s1.name, s1.age, s1.sex);
return 0;
}
三.如何计算结构体大小
首先我们来看一下这个结构体
struct s1
{
char c1;
int i;
char c2;
};
printf("%d",sizeof(struct s1));
大家觉得这个结构体的大小是多少呢? 如果单纯的按照类型大小相加,那么这个结构体的大小应该为6,那么我们来试一试,结果是多少呢。
为什么是12呢??????
我在网络上左找找,右找找。终于发现了事情的真相,原来结构体存在一种结构体对齐的操作,那么什么是结构体对齐呢?
简而言之就是说 结构体的成员 在内存中存放的时候并不是简单按顺序放在一起,而是遵循着某种规律。接下来,就让我来揭开这奇妙现象的迷雾吧
扫描二维码关注公众号,回复:
13903778 查看本文章
结构体对齐的规则:
1,第一个成员在与结构体变量偏移量为0的地址处。
2,其他成员变量要对齐到对齐数的整数倍的地址处。
3,结构体总大小为最大对齐数(每个成员都有自己的对齐数)的整数倍
4,如果嵌套了结构体的情况,嵌套的结构体对齐到自己的最大对齐数的整数倍,结构体 的大小就是所有最大对齐数的整数倍
首先我来解释几个名词:
偏移量:指的是结构体成员和结构体的第一个成员的地址的差值。
对齐数:编译器默认的一个对齐数 与 该成员大小的较小值。
我们来看一下上面的结构体是怎么计算的
struct s1
{
成员大小 默认对齐数(这里我用的vs默认对齐数为8) 对齐数
char c1; 1 8 1
int i; 4 8 4
char c2; 1 8 4
};
那么在内存中这个结构体的摆放方式,如下图所示:
根据第三条规则 结构体大小为最大对齐数的整数倍,所以这个结构体的大小为4的倍数所以为12.
今天的知识分享就到这里了,我们下次再见,拜拜