struct union enum

来源:互联网 发布:java 映射类定义方法 编辑:程序博客网 时间:2024/06/05 12:02

一、结构体声明和使用

  1. 1

    按照前面简介中的要求我们可以定义如下的结构体完成对一个人各种信息的描述:

    struct people

    {

      char Name[20];

      unsigned int Height;

      float Weight;

    };

    关键字struct表明这是在定义一个结构体,people是这种数据格式的名称,因此我们可以像使用char、int等创建变量一样 使用people创建people类型的变量了。

    C/C++:[3]如何使用struct结构体
  2. 2

    定义结构后,就可以创建这种类型的变量了:

    people person1;

    people person2;

    注意如果是C语言编程应该这样定义

    struct people person3;

    C++允许在声明结构体时省略关键字struct,而C不可以。

  3. 3

    定义的struct结构体变量可以通过成员运算符(.)来访问各个成员,如有定义:

    people person1=

    {

      "XiaoMing",

      180,

      62.5

    };

    person1.Name就是结构的Name[20]成员,使用

    cout << person1.Name << endl;

    就可以输出显示XiaoMing

  4. 4

    结构声明的位置很重要,这涉及到变量作用域,可以将声明放在函数中,也可以放到main()的前面,区别在于前者属于内部声明只能被该函数使用,后者外部声明可以被其后面的任何函数使用。

    END


翻译过来说,就是共用体,或者也叫联合体。说到了union,也就是共用体,就不得不说一下struct了,当我们有如下的struct的定义时:

struct student{     char mark;     long num;     float score;};

关于struct的内存结构,将就会像下图所示这样(在x86机器上演示):
果冻想 | 一个原创文章分享网站sizeof(struct student)的值为12bytes。但是,当我们定义如下的union时,

union test{     char mark;     long num;     float score;};

sizeof(union test)的值为4。这为什么呢?这就是需要说的。 有的时候,我们需要几种不同类型的变量存在在同一段的内存空间中,就像上面的,我们需要将一个char类型的mark、一个long类型的num变量和一个float类型的score变量存放在同一个地址开始的内存单元中。上面的三个变量,char类型和long类型所占的内存字节数是不一样的,但是在union中,它们都是从同一个地址存放的,也就是使用的覆盖技术,这三个变量互相覆盖,而这种使几个不同的变量共占同一段内存的结构,称为“共用体”类型的结构。上面定义的union类型的结构如下:
果冻想 | 一个原创文章分享网站

上面也说了,sizeof(union test)的值为4。那为什么是4呢?大体上来说,结构体struct所占用的内存为各个成员的占用的内存之和(当然也需要考虑内存对齐的问题了)。而对于union来说,在谭浩强的《C语言程序设计》中这么说:union变量所占用的内存长度等于最长的成员的内存长度。很显然,这是不对的,对于union所占用的内存大小,需要考虑内存对齐的问题。这就是为什么sizeof(union test)的值为4啦。

C中使用union

说的再好,再多,终归都是要在使用的,下面就好好的说说C中使用union。和struct一样,union只有先定义了共用体变量才能引用它。而且不能直接引用共用体变量,而只能引用共用体变量中的成员。就像我上面定义的union test。我们不能像下面这样直接引用union:

union test a;printf("%d", a);

这种直接引用是错误的,由于a的存储区有好几种类型,分别占不同长度的存储区,仅写共用体变量名a,这样使编译器无法确定究竟输出的哪一个成员的值。所以,应该写成下面这样:

printf("%d", a.mark);

同时,在使用union的时候,我们还需要注意以下的几点:

  1. 同一个内存段可以用来存放几种不同类型的成员,但在每一个时刻只能存在其中一种,而不是同时存放几种。也就是说,每一瞬间只有一个成员起作用,其它的成员不起作用,即不是同时都存在和起作用。
  2. 共用体变量中起作用的成员是最后一个存放的成员,在存入一个新的成员后,原有的成员就失去作用。比如以下的代码:
    #include <iostream>using namespace std;union test{     char mark;     long num;     float score;}a;int main(){     // cout<<a<<endl; // wrong     a.mark = 'b';     cout<<a.mark<<endl; // 输出'b'     cout<<a.num<<endl; // 98 字符'b'的ACSII值     cout<<a.score<<endl; // 输出错误值     a.num = 10;     cout<<a.mark<<endl; // 输出换行 非常感谢suxin同学的指正     cout<<a.num<<endl; // 输出10     cout<<a.score<<endl; // 输出错误值     a.score = 10.0;     cout<<a.mark<<endl; // 输出空     cout<<a.num<<endl; // 输出错误值     cout<<a.score<<endl; // 输出10     return 0;}

    所以,在使用union的时候,要十二分的小心的。

  3. 由于union中的所有成员起始地址都是一样的,所以&a.mark、&a.num和&a.score的值都是一样的。
  4. 不能把union变量作为函数参数,也不能使函数带回union变量,但可以使用指向union变量的指针。
  5. union类型可以出现在结构体类型定义中,也可以定义union数组,反之,结构体也可以出现在union类型定义中,数组也可以作为union的成员。

ENUM概况

enum枚举类型是C/C++中的一种数据类型,与struct和class一样是用户自定义的类型,其特点在于enum类型的变量取值是有限的,是可以一一列举出来的。

 

ENUM定义

C++ enum枚举格式:

enum < 枚举类型名> {< 枚举表>};

enum {< 枚举表>}< 变量名表>;

 

第一个C++ enum枚举值对应着一个整型数,通常情况下如果其中的枚举常量没有定义数值,那么第一个枚举值对应着常量值0,然后依次递增,如果第一个枚举常量定义了数值,那么其后的值将随之递增,其中每个常量之间用“,”隔开,而不是“;”,最后一个数值不用符号。

enum bool {false,true};  bool类型就是C++预定义的枚举

 

ENUM举例

 

  1. #include < iostream.h> 
  2.  
  3. void main()  
  4. ...{  
  5. //例1  
  6. enum day...{Sun,Mon,Tue,Wed,Thu,Fri,Sat};//定义一个day的枚举  
  7. day d = Sun
    //d只能等于"Sun,Mon,Tue,Wed,Thu,Fri,Sat"中的一个,没有其它值!  
  8. cout< < "value is "< < d< < endl;  
  9.  
  10. //也可以定义多个变量  
  11. enum day...{Sun,Mon,Tue,Wed,Thu,Fri,Sat};  
  12. day d1,d2,d3;  
  13. d1 = Thud2 = Satd3 = Tue;  
  14. cout< < "d1 && d2 && d3 "< < d1< < " "< < d2< < " "< < d3< < endl;  
  15.  
  16. //例2  
  17. enum ...{Sun,Mon,Tue,Wed,Thu,Fri,Sat} d;  
  18. d = Mon;  
  19. cout< < "value is "< < d< < endl;  
  20.  
  21. //例3  
  22. enum ...{Sun=10,Mon,Tue,Wed,Thu,Fri,Sat} d1,d2,d3,d4;  
  23. d1 = Sund2 = Mond3 = Tued4 = Wed;  
  24. cout< < d1< < " "< < d2< < " "< < d3< < " "< < d4< < endl
    //输出 10 11 12 13  
  25.  
  26. //例4  
  27. enum ...{Sun=10,Mon=1,Tue,Wed,Thu,Fri,Sat} d1,d2,d3,d4;  
  28. d1 = Sund2 = Mond3 = Tued4 = Wed;  
  29. cout< < d1< < " "< < d2< < " "< < d3< < " "< < d4< < endl
    //输出 10 1 2 3  
  30. }  

0 0