您的位置:首页 > 其它

关于struct,union,enum三大复合数据类型

2013-04-08 19:54 302 查看
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是一个枚举变量,而枚举变量代表的是一个整数
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: