C++结构体

    1、结构:
    结构是由程序员自己设计的数据类型,用于描述一种事物的各项数据,
    都是由若干个基础类型数据组成的

    2、设计:
    struct +结构体类型名
    {
        类型名 成员名;
        ……
    };

    3、定义:
        struct 结构体类型名 结构体变量名
        注意:C语言中在定义结构体变量时,struct关键词不能省略

    4、访问成员:
        结构体变量名.成员名;
        结构体指针->成员名;
        注意:由于结构体变量一般字节数都较大,普通值传递效率较低,因此一般都传递结构变量的地址
            存储结构变量一般存在堆内存比较合适
    练习1:设计一个教师结构体,成员有:性别、姓名、工号、工龄,定义一个教师结构变量并通过scanf输入各项成员的数据并显示

    //设计
    #include……
    #include<string.h>
    struct Student
    {
        char name[20];
        char sex;
        int id;
        double score;
    };
    int main()
    {
        //定义*
        struct Student stu={"xixi",'w',8888,750};//初始化1,一次性赋值,顺序不能乱,不足时补0

        struct Student stu; //初始化2,一个个赋值
        strcpy(stu.name,"hehe");
        stu.sex='m';
        stu.id=10086;
        stu.score=88;

        struct Student stu={.id=888,.name="hehe"};//初始化3, .成员名,.成员名,……  不需要按照顺序,只初始化某些成员

        struct Student stu={"xixi",'w',8888,750};//初始化4, 结构体变量=同类型结构变量,同类型结构变量可以直接整体赋值
        struct Student stu1={};
        stu1=stu;
        printf("%s %c %d %lf",stu1.name,stu1.sex,stu1.id,stu1.score);

        printf("%s %c %d %lf",stu.name,stu.sex,stu.id,stu.score);
    }


typedef重定义结构类型:*
    typedef struct 结构类型 结构类型
    typedef struct 结构类型
    {

    }结构类型;



    #include……
    typedef struct Data
    {
        char name[20];*
        char sex;
        int id;
        char age;
        double score;
    }Data;
    int main()
    {
        Data D;
        printf("sizeof=%d",sizeof(Data));//结构体的顺讯会影响字节数
    }
    如何计算结构体的总字节数:
        结构成员的顺序可能会影响它的总字节数,因此如果能在设计结构体时合理安排
        成员顺序可以大大地节约内存
    内存对齐:
        假定第一个成员从0地址存储每个成员的地址编号必须能被该成员类型字节数整除
        如果不能整除,则填充空白字节数直到能整除为止

       *在Linux系统中,计算结构体的对齐和补齐时,如果成员的类型字节数超过4,则按4字节算
        在Windows中会根据实际字节数算
        #pragma pack(2的整数幂)设置对齐、补齐最大字节数,Linux只能1,2,4

    内存补齐:结构体的总字节数,必须能被它字节数最大的成员整除,
    如果不能则在末尾填充空白字节直到能整除为止
联合:
    联合与结构的使用方法基本一致,与结构的区别是所有成员共用一块内存,其中一个
    成员的值改变,其他成员的值也会随之改变
    联合就是想用少量的内存对较多的标识符,从而达到节约内存的目的,现在基本不再使用
    常考的联合笔试题:总字节数多少:8
    union Data
    {
        char ch[5];
        int num;
    }
    #include……
    union Data
    {
        char ch;
        int num;
    };
计算联合的字节数时,虽然不用考虑内存对齐,但依然考虑内存补齐
如何判断系统的大小端:
假设有16进制数据0x01020304存储在0x0A起始的4字节内存中
小端系统:高位数据存在高位地址(0A:04 0B:03 0C:02 0D:01)
大端系统:高位数据存在低位地址(0A:01 0B:02 0C:03 0D:04)
注意:个人计算机一般都是小端,但是UNIX服务器和网络设备都是大端,
因此本地数据(本地字节序)传输到网络设备(网络字节序)需要进行转换,该转换称为序列化和反序列化

练习2:编写程序,判断本系统是大端还是小端*

int main()

{

union Data d={};

d.num=123;

printf("%hhd\n",d.ch);

}

枚举:enum
    枚举类型是希望把一种类型可能出现的所有的值罗列出来,并取一个有意义的名字表示,
    除此之外,该类型的值如果是其他值则非法
    注意:gcc不检查是否非法,g++检查
    可以把枚举当成值受限的int类型,但gcc编译器不检查
    注意:如果枚举成员不赋值,成员的值默认从零开始,逐渐+1,如果某个成员设置了值,
    后续的成员在他的基础上逐渐+1
    枚举常量和宏常量的区别
    1、枚举常量需要占内存,宏常量不用
    2、枚举常量的设计目的是为了限制实际数据的输入,而定义宏是为了完成代码的替换和维护
    3、枚举常量是有数据类型的,宏定义没有类型

    enum Direction
    {
        UP=183,//不能用分号
        DOWN=184,
        LEFT=186,
        RIGHT=185
    };
    int main()
    {
        enum Direction key=UP;
        printf("%d\n",key);//183
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值