结构体解析

结构体的说明

结构体是一种数据类型,用来存放多种类型的数据。

结构体的声明

就比如写一个关于一个人的结构体。

像这样在一个结构体当中包含着不同类型的数据,用这些数据来描述结构体的声明。

struct people {
	char name[8];
	int age;
	char sex[8];
};

在函数中调用时,要调用struct people作类型名,再创建变量名。

struct people{
	char name[8];
	int age;
	char sex[8];
};
int main()
{
	struct people p1 = {"jack",18,"male"};
	return 0;
}
特殊的声明
struct {
	char name[8];
	int age;
	char sex[8];
}peo;

像着这样的声明就为不完全的声明,当我们在使用的时候也是可以使用的,但这个结构体便只能使用一次。

结构体的调用

我们在使用结构体的时候如果成员变量为自己是否可行。

struct people{
	char name[8];
	int age;
	char sex[8];
    struct people ptr1;
};

很可惜,结构体的成员变量只是数据类型,并不具备和函数一样调用其本身的行为。如果想要在结构体中调用结构体,最终结构便是无限循环下去,正确写法如下。

struct people{
	char name[8];
	int age;
	char sex[8];
    struct people* ptr1;
};

使其指向的变为一个指针,这样就可以完美的解决问题。

结构体的大小

首先我们先来计算一下这个结构体的字节(在32位机器下)

struct people{
	char name;
	char sex;
	int age;
};

如果按照平常的加减来说应该位1+4+1为6,但是结果为多少呢。

结果为12,说明结构体的大小并不是那样直接加起来的,这其中涉及一个名为最大对其数的东西。最大对齐数由编译环境影响,在vs中结构体的最大对齐数位8。

结构体大小计算,是用结构体中的成员变量的大小相比较,取较小的当做对齐数,使其的偏移量整数倍,如果不是便到整数倍再放入数据,多余的空下舍去,最后结构体的总大小一定要是所有成员数中最大的对齐数的整数倍。

如图所示,因为int为4个字节,而与其对齐数的整数倍只有8,所以为了满足对齐数,只能舍去两个字节后,再在地址上进行存放,age结束为偏移量为8,满足结构体的总大小为所有成员数中最大的对齐数的整数倍,所有不用浪费空间了。

其实默认的对齐数也可以我们自己进行修改,这时我们就需要用到一个预处理指令 #program pack(),通过在括号内写上数字,便可以改变其的默认对齐数。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值