C++结构体和共用体

来源:互联网 发布:unsw moodle 网络 编辑:程序博客网 时间:2024/05/17 09:02

· 结构体就是一个可以包含不同数据类型的一个结构,它是一种可以自己定义的数据类型,它的特点和数组主要有两点不同,首先结构体可以在一个结构中声明不同的数据类型。第二,相同结构的结构体变量是可以相互赋值的,而数组是做不到的,因为数组是单一数据类型的数据集合,它本身不是数据类型(而结构体是),数组名称是常量指针,所以不可以做为左值进行运算,所以数组之间就不能通过数组名称相互复制了,即使数据类型和数组大小完全相同。

const int MAX_CHAR=128;struct Student{    char name[MAX_CHAR];    char sex[MAX_CHAR];    unsigned int age;    char addr[MAX_CHAR];};Student stdnt;stdnt age;

在定义结构体变量时,编译器会为变量分配足够的空间以容纳结构体的所有成员。如果定义下面一个结构体变量,编译器将为其分配多大的空间呢?

struct ByteAlign{    double menOne;    char   menTwo;    int    memThree;};

在定义结构体ByteAlign的变量时,应分配13个字节。但实际使用sizeof函数测试时,发现结构体ByteAlign的变量占用16个字节,主要结构体的字节对齐问题造成的。

.在开发应用程序时,有时需要在一个字节中表示多项内容。例如,在描述IP协议时,其首部长度占4位,版本号占4位。C/C++语言提供了位域,允许用户单独访问一位数据。在定义位域时,也可以不指定成员名称,这样可以预留一些空间。

typedef struct HeadIP{    unsigned char headerlen:4;  //首部长度,占4位    unsigned char version:4;    //版本,占4位};struct FieldZone{    unsigned char:4;    unsigned char memTwor:2;    unsigned char memThree:1;};//用户在访问memTwo成员时,将直接从一个字节的第5位开始读取数据。

. 共用体类型也是用来描述类型不实相同的数据,但与结构体类型不同,共用体数据成员存储时采用覆盖技术,共享(部分)存储空间。即每一个成员共享同一个内存空间。union的大小由最大的成员的大小决定union成员共享同一块大小的内存,一次只能使用其中的一个成员。对某一个成员赋值,会覆盖相应字节上的值,比如对char成员赋值就不会把整个int成员覆盖掉,因为char只占一个字节,而int占四个字节。共用体union的存放顺序是所有成员都从低地址开始存放的。

union TypeSet{    double dbRate;    char szFlag;    int nCount;};

这里写图片描述

0 0
原创粉丝点击