关于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是一个枚举变量,而枚举变量代表的是一个整数
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是一个枚举变量,而枚举变量代表的是一个整数
相关文章推荐
- 自定义数据类型(typedef,enum,struct,union)
- 第六讲:c/c++复合数据类型struct以及联合类型union,动态内存申请malloc和calloc
- 构造数据类型struct,共用体union,枚举类型enum,宏#define的区别
- Hive复合数据类型array,map,struct的使用
- C++中常见数据类型的sizeof值,以及计算struct和union的详细方法
- C++中数据对齐问题。struct、union、enum,类继承。再谈sizeof()
- 结构体struct、枚举enum、联合体union、位字段、自定义类型typedef、字节对齐
- MySQL——union(合并结果集)、limit(获取部分数据)、关于MySQL中常用数据类型
- 1.0 基础、标示符、常量、数据类型(enum 枚举,struct 结构体)、操作符、循环、数组
- hive复合数据类型 array、map、struct使用
- hive的三种复合数据类型array、map、struct以及自定义分割符示例
- 关于 Union,Struct and Class的大小计算问题的思考(转)&union和struct类型的大小计算(转)
- hive复合数据类型之struct
- enum,struct,union类型使用和长度
- 关于C与C++的struct,union,enum用法差异
- Hive复合数据类型array,map,struct的使用
- C# 之 结构体(struct)---复合类型的数据结构
- enum,struct,union类型使用和长度
- 妙用union和enum实现只有一个数据成员的类可存储不同的类型
- 基本数据类型变量 结构体 union 类的内存字节对齐