C++基础--第十九章自定义数据类型

结构体

定义形式

结构体变量的定义和初始化

1.定义结构体同时声明结构体变量、初始化

2.先定义结构体,然后再定义结构体变量

注意:C++中允许不用加struct,既直接"结构体类型名  变量名"

struct stu

{

        int S_num;

        int S_number;

};

        

int main()

{

        stu A= {9,50};

        cout<<A.S_num;

        return 0;

}

3.直接定义(不要结构体类型名)---以后不能单独定义结构体变量

结构体变量的使用

具有相同类型的结构体变量可以进行赋值运算,但是不能输入输出

对结构体变量的成员引用:结构体变量名.成员名

指向结构体的指针变量引用格式:指针变量名->成员名;

结构体作为函数传递有三种:值传递,引用传递,指针传递

typedef关键字

作用:为创建的类型取别名

结构体大小和字节对齐

空结构体大小为1,不为空时要按字节对齐。

三个概念

        自身对齐值:数据类型本身的对齐值,结构体或类的的自身对齐值是其成员中最大的那个值,例如char类型的自身对齐值是1,short类型是2;

        指定对齐值:编译器或程序员指定的对齐值,32位单片机的指定对齐值默认是4

        有效对齐值min(自身对齐值,指定对齐值)

字节对齐的三个准则

       1. 结构体变量的首地址能够被其有效对齐值的大小所整除

       2. 结构体的总大小为结构体有效对齐值的整数倍。

       3. 结构体每个成员相对于结构体首地址的偏移量都是有效对齐值的整数倍。

要点:

        结构体的总大小为结构体有效对齐值的整数倍。

        每个元素的起始地址应该是自身长度的整数倍

可以通过#pragma pack(m)来设定变量以m字节对齐

        例:指定对齐值为8(64位机默认)

#pragma pack(8)

struct st

{

        char c1;//1

        char c2;//2

        int i1;//8  int  起始地址按照字节对齐的原理应该是它长度4的整数倍

        char c3;//12

        short s4;//12 short 起始地址按照字节对齐的原理应该是它长度2的整数倍 10 + 2 = 12

        double d;//24 double 起始地址按照字节对齐的原理应该是它长度8的整数倍 12->16 + 8 = 24

        char c4;//32   24 + 4 = 28 结构体的总大小为8的整数倍 28->32

        int i2;//32  28+4 = 32

        int i3;//40  

        short s5;//40---8*5=40(整数倍)

};



int main()

{

        cout << sizeof(st) << endl;//40

        return 0;

}

        例:指定对齐值为4字节

#pragma  pack(4)

struct st

{

        char c1;//1

        char c2;//2

        int i1;//8

        char c3;//12

        short s4;//12

        double d;//20

        char c4;//24

        int i2;//28

        int i3;//32

        short s5;//36

};



int main()

{

        cout << sizeof(st) << endl;//36

        return 0;

}

公用体(union)

几个不同的变量共享同一个地址开始的内存空间。

成员类型可以是基本数据类型,也可以是构造数据类型。

公用体变量初始化时,只能对第一个成员赋值

公用体变量所占的内存长度等于最长的成员长度

公用体变量在一个时刻只能一个成员发挥作用,赋值时,成员之间会互相覆盖,最后一次被赋值的成员起作用。

定义

初始化

使用

公用体变量名.成员名

注意:指针不能指向公用体

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值