C的struct, union, enum

2017-12-16 18:54:58来源:CSDN作者:u010318270人点击

分享
结构体类型的变量的成员变量可以具有不同的类型,通过成员变量的名称获取指定成员。联合类型的变量的所有成员都共享同一存储空间,每次只能存储一个成员。枚举类型是一组命名了的整数值。 一、结构体 struct1、结构声明struct tag { member-list } variable-list;
struct {    int a;    char b;    float c;} x;// 创建了一个名叫x的变量,包含三个成员:一个整数,一个字符,一个浮点数struct {    int a;    char b;    float c;} y[20], *z;// 创建了y和z, y是一个数组,包含了20个结构。z是一个指针,指向这个类型的结构z = &x;  // 非法的,编译器认为这两个声明是截然不同的类型。标签允许多个声明使用同一个成员列表,并且创建同一种类型的结构。//声明把标签SIMPLE和这个成员列表联系在一起。该声明并没有提供变量列表,所以它并未创建任何变量struct SIMPLE{    int a;    char b;    float c;};// x、y、z是同一种类型的结构变量struct SIMPLE x;struct SIMPLE y[20],*z;使用typedef创建一种新的结构类型//声明结构时可以用typedef创建一种新的类型。typedef struct {    int a;    char b;    float c;} Simple;// Simple是个类型名而不是个结构标签Simple x;Simple y[20],*z;2、结构的初始化struct INIT_EX {    int a;    short b[10];    Simple c;} x={    10,    {1,2,3,4,5},    {25,'x',1.9}};3、结构成员的访问结构体类型变量.成员变量4、结构、指针和成员typedef struct {    int a;    short b[2];} Ex2;typedef struct EX_TAG {    int a;    char b[3];    Ex2 c;    struct EX_TAG *d;  // 结构的自引用。(1)只能是指针不能是结构;(2)定义结构标签来声明这个指针} Ex;Ex x={10,"Hi",{5,{-1,25}},0};Ex *px=&x;px + 1    // 非法的*px       // 指向整个Ex结构体*px + 1   // 非法的*(px+1)   // 非法的px->a     // 10px->b[1]  // 数组b的第2个元素 ipx->c.a   // 5*px->c.b  // px->c的结果是结构c,px->c.b访问结构c的成员b。b是一个数组,所以px->c.b是一个指针,指向数组的第1个元素,*px->c.b就是b[1],即-1px->d     // 访问指针成员,0
二、联合 union联合类型的变量可以由具有不同类型的一个或多个成员变量构成,但编译器只为联合类型的变量分配最大的成员变量需要的内存空间。联合的所有成员引用的是内存中的相同位置union是固定首地址,按最大需求开辟一段内存空间1、联合声明union {    类型 成员变量1;    类型 成员变量2;} 联合变量;2、联合初始化联合类型的变量初始化,只有第一个成员可以获得初始值。union {    类型 成员变量1;    类型 成员变量2;} 变量 = {成员变量1的值};把联合类型的变量x的第一个成员变量a初始化为5。union {    int   a;    float b;    char  c[4];} x = {5};3、联合的主要应用(1)通过在结构体类型(struct)中使用联合类型(union)节省空间。(2)使用联合类型的变量作为数组元素构建含有不同类型的混合的数据结构。# sizeof(struct s1) = 0// 只有类型,没有变量struct s1{    union u{ int i; };     struct ss1{ int i; }; };# sizeof(struct s2) = 8// 定义一个union变量和一个struct变量struct s2{    union { int i; };     struct { int i; }; };# sizeof(struct s3) = 8// 定义联合变量su33,结构变量ss33struct s3{//the same to s2    union su3{ int i; } su33;     struct ss3{ int i; } ss33; };
union su4{ int i; }; struct ss4{ int i; };# sizeof(struct s4) = 8// 定义联合变量su44,结构变量ss44struct s4{//the same to s3     union su4 su44;     struct ss4 ss44; };# sizeof(struct s3) = 0// 声明联合标签su4,结构标签ss4struct s5{//the same to s1     union su4;     struct ss4; };# sizeof(struct s3) = 0// int; 只有声明,没有定义struct s6{//the same to s1    union { int; };     struct { int; }; };
三、枚举 enum枚举的值可以作为整数使用,但不要把整数作为枚举的值。enum {    枚举常量1,    枚举常量2,    ...    枚举常量n} 枚举变量1,枚举变量2;
参考:http://blog.csdn.net/huqinweI987/article/details/23597091http://blog.csdn.net/lemonrabbit1987/article/details/47803377

相关文章

    无相关信息

最新文章

123

最新摄影

闪念基因

微信扫一扫

第七城市微信公众平台