c语言学习————结构、联合、枚举

结构:

什么是结构:

​    是一种由程序员设计的复合数据类型,它由若干个其它类型的成员组成,用于统一描述事物的各项属性。

​    使用各类型的变量也可以描述事物的各项属性(如:通讯录项目),但使用麻烦且容易出错,没有使用结构方便,安全性高、统一性高,同时结构也是面向对象编程的基础。

定义结构体

struct 结构名{

        成员类型  成员名;

        ……

};

为了便于使用都会使用typedef 重定义一个更加便利的名字;

如 typedef  book{

        char   name[20];

        float   prince;

} B;

B books[200];//这样就定义了200个book的结构体

初始化结构变量:

struct 结构名 结构变量名 = {v1,v2,v3,...}; 
struct 结构名 结构数组[n] = {
    {v1,v2,v3,...},
    {v1,v2,v3,...},
    ...
};

// 指定成员初始化 
struct 结构名 结构变量名 = {
    .成员名1 = 初始化数据1,
    .成员名2 = 初始化数据2,
    ...
};

struct 结构名 结构数组[n] = {
    {.成员名1 = 初始化数据1,.成员名2 = 初始化数据2,...},
    {.成员名1 = 初始化数据1,.成员名2 = 初始化数据2,...},
    {.成员名1 = 初始化数据1,.成员名2 = 初始化数据2,...},
    ...
};

访问成员:

1. 结构变量.变量名   如上述:book.name

2.结构指针->变量名 如上述: book->name

如何计算结构的总字节数:

1、结构变量的总字节数 >= 所有成员的字节数总和

2、结构成员的顺序会影响结构的总字节数

3、了解结构总字节数计算规则,可以通过合理安排成员的顺序达到节约内存的目的

4、计算机为了提高结构成员的访问速度,会在结构变量的内部填充一些空闲的内存,这叫做内存对齐和补齐

5、在笔试题中考的非常多,希望大家重视。

内存对齐:

假定从0字节排列结构的第一个成员,之后所有成员的起始字节数,必须是成员本身字节数的整数倍,如果不是则填充一些空闲字节。

typedef struct Data
{
    char ch;        // 0
                        // 1 2 3 空闲了3个字节用于内存对齐因为1不是4(int字节数)的倍数因此要补3个空闲字节
    int num;      // 4 5 6 7      

                        共用了8个字节为其中最大的4字节的倍数因此末尾不用补空字节     

 }Data;  

注意:

在32位系统下,内存对齐、内存补齐字节数是有上限的,超过上限按4字节计算。

// 在Linux32位系统下,超过4字节按4字节计算。
typedef struct Data
{
    char ch;    // 0
                // 1 2 3 原本应该补到8但是因为上面的那条超过4的按4来补齐
    double num; // 4 ~ 11
    short sh;   // 12 13
                // 14 15   共14个字节不为最大4的整数(正常应是8同理上述原则视为4)要补到16个字节
}Data;

结构成员的位域:

早期由于计算机内存资源比较匮乏,一种节约内存的方式。

联合:

也是一种由程序员设计的复合数据类型,使用语法与结构一模一样,与结构不同的是,结构中的成员各自拥有独立的内存,而联合中的所有成员共用一块内存(也叫共用体),所以只要有一个成员的值发生变化,其它成员的也会跟着一起变化。

  

联合的总字节数:

由于联合的所有成员共用一块内存,所有成员是天然对齐的,不需要考虑内存对齐,但要考虑内存补齐。

情况1:所有联合的成员都是基本类型,则联合的总字节数就是最大成员的字节数。

情况2:如果联合的成员有数组类型,则联合的总字节数应该是最大成员的整数倍。

使用联合的意义:

1、使用少量的内存对应若干个标识符,只要不同时使用联合的成员,就不会冲突,能大大节约内存,在早期计算机内存比较小时,该技术使用较多,现在随着计算机内存越来越大已经基本不再使用。

2、联合可以对一块内存进行不同格式的解释,所以在网络通信时还存在着少量的使用(使用网络协议中已经设计好的联合体)。

大端系统和小端系统:

大端系统:

低位数据存储高位地址,或者说是高位数据存储在低位地址,一般大型的服务器、网络设备采用的是大端系统,所以大端格式也叫网络字节序。

小端系统:

低位数据存储在低位地址,或者说高位数据存储在高位地址,一般的个人计算机采用的是小端系统。

注意:

数据存储的是大端格式还是小端格式是由计算机的CPU决定的。

int num = 0xa1b2c3d4;

大端系统

0xbf9f3828    存储的是0xa1
0xbf9f3829    存储的是0xb2
0xbf9f382a    存储的是0xc3
0xbf9f382b    存储的是0xd4

小端系统

0xbf9f3828    存储的是0xd4
0xbf9f3829    存储的是0xc3
0xbf9f382a    存储的是0xb2
0xbf9f382b    存储的是0xa1

枚举:

是一种值受限的整数类型,由程序员设置它的值的范围,并且还可以给这些值取一个名字。

定义枚举变量:

enum 枚举名 枚举变量;

1、理论上枚举变量只能使用枚举值赋值,这样可以提高代码的可读性和安全性。

2、C语言编译器为了提高编译速度,不会检查枚举变量的赋值,全靠程序员的自觉(枚举变量就是int类型变量)。

3、C++编译器类型检查比较严格,所以使用C++编译器编译C代码时,枚举变量只能由枚举值赋值、比较。

枚举值:

1、第一个枚举值的默认值是0,之后的枚举值逐渐递增+1。

2、可以使用=设置枚举值,没有进行设置的枚举值是上一个枚举值递增+1。

3、枚举值可以单独使用,这种用法可以给没有意义的字面值数据取一个有意义的名字,这样可以提高代码的可读取性,也可以定义匿名的枚举,只使用枚举值。

4、枚举值是常量,所以可以与switch语句配合使用,枚举值可以写在case的后面。

5、枚举值的作用域是全局的(尽量名字取的复杂一些),所以它不能与全局变量、函数、结构、联合重名。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值