C语言中的结构体

本篇文章主要探讨结构体的创建初始化结构体的内存对齐

目录

结构体介绍

结构体类型声明、创建和初始化 

结构体内存对齐


结构体介绍

C语言提供了丰富的数据类型来描述生活中的各种数据。
使用整型类型来描述整数,使用字符类型来描述字符,使用浮点型类型来描述小数。

C语⾔已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类
型还是不够的,假设我想描述学⽣,描述⼀本书,这时单⼀的内置类型是不⾏的。描述⼀个学⽣需要名字、年龄、学号、身高、体重等;描述⼀本需要作者、出版社、定价等。C语⾔为了解决这个问题,增加了结构体这种⾃定义的数据类型,让程序员可以⾃⼰创造适合的类型。

📌 结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如:标量、数组、指针,甚⾄是其他结构体。

结构体类型声明、创建和初始化 

以学生为例,声明一个学生的结构体类型

struct Stu
{
    //成员变量
	char name[15];//姓名
	int age;//年龄
	char id[20];//学号
	float height;//身高
	float weight;//体重
};//分号不能丢

这样,就能创建一个学生的结构体变量了:

创建完成后,就能够对这个学生的姓名、年龄等(结构体变量)进行初始化了。

有以下两种初始化方式:

第一种:按成员变量顺序进行初始化

int main()
{
	struct Stu s1 = { "zhangsan",18,"001",170.0,70.0 };
                     //姓名    年龄   学号  身高  体重
	return 0;
}

第二种:按自己的指定顺序进行初始化(.成员变量)

int main()
{
	struct Stu s1 = { .age = 18, .height = 170.0, .weight = 70.0, .name = "zhangsan", .id = "001" };
                    //年龄       身高              体重             姓名               学号
           
	return 0;
}

那么,初始化完成后,要把学生一号的信息打印出来,我们需要借助到访问结构体成员的两个操作符:.(直接访问操作符)和 ->(间接访问操作符)。

.使⽤⽅式:结构体变量.成员名

->使⽤⽅式:结构体指针->成员名

 使用以上两种方式打印学生一号的信息:

结构体内存对齐

结构体的大小如何计算?

⾸先得掌握结构体的对⻬规则:
1.结构体的第一个成员对⻬到和结构体变量起始位置偏移量为0的地址处。
2.其他成员变量要对⻬到起始位置偏移量为对齐数的整数倍的地址处。
对⻬数=编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值。
VS 中默认的值为 8 。
Linux中gcc没有默认对⻬数,对⻬数就是成员⾃⾝的⼤⼩。
3.结构体总大小为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的
整数倍。
4.如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数倍处,结构
体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。

练习

//练习1
struct S1
{
double d;
char c;
int i;
};
printf("%zd\n", sizeof(struct S1));

//练习2——结构体嵌套问题
struct S2
{
char c1;
struct S1 s1;
double d;
};
printf("%zd\n", sizeof(struct S2));

答案

int main()
{
	struct S1
	{
		double d;//对齐数:8
		char c;//对齐数:1
		int i;//对齐数:4
		//最大对齐数:8
	};
	printf("%zd\n", sizeof(struct S1));//16
//8(double大小)+1(char大小)+3(浪费的空间,使i对齐到起始位置偏移量为对齐数4三倍(整数倍)的地址处)+4(int大小)=16
//16为最大对齐数8的两倍(整数倍),因此该结构体的大小为16

	struct S2
	{
		char c1;//对齐数:1
		struct S1 s1;//对齐数:8
		double d;//对齐数:8
		//最大对齐数:8
	};
	printf("%zd\n", sizeof(struct S2));//32
//1(char的大小)+7(浪费的空间,使s1对齐到起始位置偏移量为对齐数8一倍(整数倍)的地址处+16(s1大小)+8(double大小)=32
//32为最大对齐数8的四倍(整数倍),因此该结构体的大小为32
	return 0;
}

以上就是本篇文章关于C语言中结构体的所有内容,感谢各位读者的支持! 

  • 41
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值