基础备忘:结构体、联合、枚举笔记

结构体

占内存大小:最大成数数据类型大小*成数数据个数。

定义和声明方式:

方式1:先定义结构体类型,然后声明一个该类型的变量

struct Student
{
       char Name[20];
       int Number;
       int Age;
       char Sex;
       float Score;
       };
struct Student Stu;//声明struct Student类型变量 

方式2:定义结构体类型的同时,声明变量。如果是声明多个,用逗号分隔。

struct Student
{
       char Name[20];
       int Number;
       int Age;
       char Sex;
       float Score;
       }Stu;//声明struct Student类型变量 多个则此行代码为 }stu1,stu2;
方式3:在采用方式2的时候,可以把结构体类型名省略。如下:

struct
{
       char Name[20];
       int Number;
       int Age;
       char Sex;
       float Score;
       }Stu;//声明struct Student类型变量 

方式4:用关键字typedef声明结构体变量。如下:

typedef struct
{
       char Name[20];
       int Number;
       int Age;
       char Sex;
       float Score;
       }Student;
Student Stu;//此时不再需要写成struct Stuent Stu: 

初始化方式:

假设有一个如下的struct定义:

struct astruct

{

int a;

int b;

};

struct astruct test = {0};

即使astruct中都是基础类型的成员这样的初始化话也是不正确的。

这种初始化仅仅是把a变量设置为了0,而未对b变量做初始化。

产生这样错误的原因,大概是收到数组初始化的影响。数组是可以这么初始化话的,而且初始化的值只能是0!

对结构体的初始化,可以有一下四种。

struct test
{
    int a;
    int b;
};

int main()
{
    struct test t1 = {0, 0};

    struct test t2 = {
        .a=2,

        .b=3
    }; 

    struct test t3 = {
        a:12345,

        b:567890
    }; 

  struct test t4;

t4.a=4;

t4.b=5;

    printf("t1.a = %d, t1.b = %d\n", t1.a, t1.b);
    printf("t2.a = %d, t2.b = %d\n", t2.a, t2.b);
    printf("t3.a = %d, t3.b = %d\n", t3.a, t3.b);

    return 0;
}

第1种使我们最常见的方式,2,3中是gcc的扩展,非标准。

范例:

#include<iostream>
using namespace std;
struct Stu{
       char a;
       int b;
       };

int main()
{
    struct Stu s1={'x',1};
    struct Stu s2;
    s2.a='x';
    s2.b=2;
  /*  
    struct Dtu s3={
           .a='x',
           .b=3
           };
           */  //Dev c++不支持 
    struct Stu s4={
           a:'x',
           b:4
           };
    cout<<"s1 "<<s1.a<<" "<<s1.b<<endl;
    cout<<"s2 "<<s2.a<<" "<<s2.b<<endl;
//   cout<<"s3 "<<s3.a<<" "<<s3.b<<endl;
    cout<<"s4 "<<s4.a<<" "<<s4.b<<endl;
    system("pause");
    }

成员引用方式:

方式1:

        结构体变量名.成员名

方式2:

        指针变量名->成员名

方式3:

       (*指针变量名).成员名

结构体指针:

       一般定义格式为: struct  结构体名 *结构体指针名

#include<iostream>
using namespace std;
struct Stu {
       char name[20];
       int number;
       char Sex;
       } *p;
int main()
{
    struct Stu s1={"HK",18,'M'};
    p=&s1;
    cout<<p->name<<" "<<p->number<<" "<<p->Sex<<endl;
    struct Stu *q;
    q=&s1;
    cout<<q->name<<" "<<q->number<<" "<<q->Sex<<endl;
    system("pause");
    }


联合

占内存大小:在联合中,各成员共享一段内存空间,一个联系变量的长度等于各成员中长度最长的长度。

声明:与struct的4种声明一样,只是关键字struct改成union。

初始化:对于每个union对象,只能对union成员中的一个进行初始化。其它成员则没有值。

#include<iostream>
using namespace std;
union Stu {
       char name[20];
       int number;
       char Sex;
       };
int main()
{
    union Stu s1,*p;
  //  s1.name="HK";//incompatible types in assignment of `const char[3]' to `char[20]' 
    cin>>s1.name;
  //  cin>>s1.number;
  //  cin>>s1.Sex;
    p=&s1;
    cout<<s1.name<<" "<<s1.number<<" "<<s1.Sex<<endl;
    cout<<p->name<<" "<<p->number<<" "<<p->Sex<<endl;
    system("pause");
    }


成员引用方式:同struct。


枚举

枚举类型实质上是整数集合。

#include<iostream>
using namespace std;
enum exam{you,liang,zhong,jige,bujige};
int main()
{
    cout<<"size: "<<sizeof(exam)<<endl;
    cout<<you<<'\t'<<liang<<'\t'<<zhong<<'\t'<<jige<<'\t'<<bujige<<endl;
    system("pause");
    }

运行结果为

size: 4

0 1 2 3 4

占内存大小:根据不同编译器会有所不同,在devc++下是4,在其它编译器下也有可能是1。

声明与定义:

定义类型与声明变量:

        方式1:

        enum exam{you,liang,zhong,jige,bujige};//定义枚举类型

        enum exam s1,s2;//声明枚举类型变量

        方式2:

       enum exam{you,liang,zhong,jige,bujige}s1,s2;

对于枚举型变量s1和s2到这里还只是进行了声明,声明后的初始值没有意义。

定义枚举型变量:

#include<iostream>
using namespace std;
enum exam{you=90,liang=80,zhong=70,jige=60,bujige=30};
int main()
{
    enum exam s1,s2,*p,*q;
    s1=you;//定义枚举类型变量 
    s2=zhong;//定义枚举类型变量
    if(s1>=s2)
       if(s1>s2)
       cout<<"s1>s2"<<endl;
       else 
       cout<<"s1=s2"<<endl;
    else 
       cout<<"s1<s2"<<endl;
    p=&s1;
    q=&s2;
    cout<<s1<<endl;
    cout<<s2<<endl;
    int sum=*p+*q;
    cout<<sum<<endl;
    system("pause");
    }




  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值