结构体的说明
结构体是一种数据类型,用来存放多种类型的数据。
结构体的声明
就比如写一个关于一个人的结构体。
像这样在一个结构体当中包含着不同类型的数据,用这些数据来描述结构体的声明。
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(),通过在括号内写上数字,便可以改变其的默认对齐数。