struct/union/enum的区别

来源:互联网 发布:263工程数据 编辑:程序博客网 时间:2024/05/19 23:28

关于C++和C的区别:
区别最大的是struct,C++中的struct几乎和class一样了,可以有成员函数,而C中的struct只能包含成员变量。enum,union没区别。


struct的定义:

struct  结构标签

{

     类型1 标识符1;

     类型2 标识符2;

     类型3 标识符3;

     类型4 标识符4;

     类型5 标识符5;

};

1、建议将struct的声明和变量的定义分开写,

2、struct内可以放任何类型的变量声明。


struct的内存对齐:

对齐原则:

1、数据成员对齐规则。每个数据成员存储的起始位置要从该成员大小的整数倍开始。

2、数据成员包含结构体:结构体成员要从其内部最大元素大小的整数倍地址开始存储。

3、结构体的总大小:是其内部最大基本成员的整数倍,不足的要补齐。
这个似乎不太重要,没有太大的关系。也就是某些面试或考试题中的难为人的地方了。

union的定义:

union 联合标签

{

     类型1 标识符1;

     类型2 标识符2;

     类型3 标识符3;

     类型4 标识符4;

     类型5 标识符5;

};


联合体与结构体的区别:

1、结构体中,每个变量依次存储。

2、联合体中,每个变量都是从偏移地址零开始存储,每次只有一个成员存储于该地址。


enum的定义:

enum 枚举标签{small, media =7, large =10,humungous};

1、枚举通过简单的操作将一串名字和一串整型值相联系起来。

2、缺省情况下,枚举从零开始,如果对列表中的某一个标识符赋值,下一个标识符值比前面一个的值大1.

3、#define 定义的值在编译时候消失,但是枚举定义的,则在调试的过程任然是可见的,可以在代码调试中使用它们。
其实 enum可以相对应define来使用。

举个例子:
union a
{
    int b;
    charc;
};
a abc;
abc.b=4;
abc.c=5;
//或者也可以直接在定义时定义变量
union a
{
    int b;
    charc;
}abc;
abc.b=4;
abc.c=5;
或者:
typedef union
{
    int b;
    charc;
}a;
a abc;
abc.b=4;
abc.c=5;

仔细的看看,很重要,老是用的不对,自己给自己找麻烦的。

/////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////

struct的最终大小考虑是最大的那个类型的倍数和每个都要对齐; 
enum的大小考虑是最大的那个 
enum是枚举,就是某个变量的值是能够列举的,比如,星期的话就每周1到7,月的话就1到12、而struct的话是对于某个变量是有很多数据类型构成一个总体的,比如学生这个变量,他需要学号,姓名,年龄,性别等等,这个时候就需要定义结构体了。而uninon的话呢,其中定义的变量都只占一同块内存。。。   

对于结构体:考虑要对齐和占用最大空间的元素所占空间的倍数

对于联合体:考虑是里面所有类型数据占用空间的倍数同时还要比最大的那个还要大的最小数,就是联合体占用的空间,注意数组类型的处理!!!

typedef enum
{
 ANUnknown = 0,
 ANShapeFile = 1,
 ANSDEDatabase = 2,
 ANFileDatabase = 3,
 ANRasterFile = 4
}ANDataType;

sizeof(ANDataType) 为 4

======================================================
struct AAA
{
 double d;
 char ss;
 char s;
};

sizeof(AAA) 为 结构中长度最大的变量的倍数(遵循内存对齐的原则),如上,double的长度为 8, 则整个为 8*2 = 16, 因为 char 长度为1,两个char为2,仍小于8,故按8计算,若有9个char变量,则其中 8个char 合计为 8,剩余一个不

足8 按 8字节计算。比如:
 struct AAA
{
 double d;
 char s1;
 char s2;
 char s3;
 char s4;
 char s5;
 char s6;
 char s7;
 char s8;
 char s9;
};
按结构体中的变量的长度叠加,则大小为 8+(1+1+1+1+1+1+1+1)+1 =17,  16 < 17 < 24, 则结构体的大小为 24
比如,

 structAAA
{
 double d;
 char s1;
 int i;
};
按结构体中的变量的长度叠加,则大小为 8+1+4 = 13,  8 < 13< 16, 则结构体的大小为 16

======================================================

union AAA
{
 double d;
 int i;
};

联合,则以定义中最大的数据类型的长度为准,此联合的 size 为8

备注: union与 struct 的大小与其内部定义的函数无关!!!