struct结构体
struct声明一个结构体,它将一些相关联的数据打包成一个整体。
首先看结构体占用内存空间的大小。
struct student
{
}stu;
sizeof(stu)是多少?
这里我们联想到前面讲到的模子的概念,大概就知道答案了。
关于求结构体所占内存空间的大小,我们遵循字节对齐的原则,计算的出的结果是8的倍数。看下面的代码:
struct student
{
char i;
int x;
float c;
double a;
}stu;
结果是24。分析为什么?
一个很少用的概念:柔性数组。在计算结构体大小时,并不计算在内,他和结构体没有任何联系。
struct student
{
char i;
int x;
float c;
double a;
int m[];
}
结果是多少?为什么?
Union共用体
union维护足够的空间来放置多个数据成员中的一种,而不是每一个数据成员配置空间。在union中所有的数据成员共用一个空间,同一时间只能存储一个数据成员,所有的数据成员具有相同的起始地址。
union state
{
char ch;
int intmax;
char *sh;
double dou;
}st;
在上面的共用体中,union的内存空间就是double所占用的空间8.
那么,在计算机里面,数据的存储和系统的结构有关系,大端小段对数据存储又有什么关系?
大端模式:子数据的高字节存储在低地址,而子数据的低字节则存放在高地址中。
小端模式:子数据的高字节存储在高地址,而子数据的低字节则存放在低地址中。
union型数据所占据的空间等于最大的成员所占的空间。对union型的成员的存取都是相对于该联合体基地址的偏移量为0开始,也就是联合体的访问不论对哪个变量的存取都是从union的首地址位置开始。
既然这样,我们就可以通过union来判断当前系统的模式。
如果取出的低地址上的值为0,毫无疑问,这是大端模式,如果取出的是低地址上的值为1,就是小端模式。
-
int checkState()
-
{
-
union check
-
{
-
int i;
-
char ch;
-
}c;
-
c.i = 1;
-
return (c.ch==1);
-
}
程序代码如上所示。
enum枚举
一般的定义如下:
enum enum_type_name
{
ENUM_CONST_1,
ENUM_CONST_2,
.....
ENUM_CONST_B,
}enum_variable_name;
enum_type_name 是自定义的一种数据类型名,而enum_variable_name 为enum_type_name 类型的一个变量,也就是枚举变量。实际上enum_type_name 类型是一个变量取值范围的限定,而花内是他的取值范围。括号里面的成员都是常量,也就是枚举常量。enum变量类型还可以给其中的常量符号赋值,如果不赋值就会从被赋值的那个常量开始一次家1,都没有赋值就从0开始一次加1.例如:
enum color
{
GREEN = 1,
RED,
BLUE,
GREEN_RED = 8,
GREEN_BLUE
}colorVal;
则枚举常量的值为:
GREEN = 1,
RED = 2,
BLUE = 3,
GREEN_RED = 8,
GREEN_BLUE = 9,
那么sizeof(colorVal)的大小是?答案是4.因为colorVal是一个枚举变量,而枚举变量代表的是一个整数