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