c语言从0开始_16结构、联合、枚举类型

结构:struct

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

设计

 一般结构体设计在头文件,或函数外,方便其它文件、其它函数使用
struct 结构体名
{
    类型 成员名;
    ...
};

定义结构变量:

    struct 结构体名 结构体变量名;
    注意:c语言中,在定义结构体变量时,struct不能省略

定义结构变量并初始化:
    struct 结构体名 结构体变量名 = {v1,v2,v3...};
    必须按照结构成员设计顺序来初始化

    struct 结构体名 结构体变量名 = {.成员名=v1,.成员名=v2...};
    只初始化某个成员,不用关注顺序

    注意:同类型的结构变量可以直接赋值。
    struct Student stu1,stu2;
    stu1 = stu2;

访问成员:

    结构体变量名.成员名;
    结构指针->成员名;

使用堆内存存储结构变量

    struct TypeName* p = malloc(sizeof(struct TypeName));
    由于此编译时,堆内存还没有分配,所以编译器无法初始化,只能批量赋值,或单个赋值。

写结构体的printf和scanf时记得用空格隔开变量

结构体变量作为形参时:
    由于结构体变量的字节数都比较大,值传递的效率比较低,因此都是传递结构变量的地址,如果不需要修改结构变量值,可以使用const保护

typedef 重定义结构类型

    typedef struct 结构名 结构名;
    之后就不需要使用struct关键字了

    typedef struct 结构名
    {
        类型 成员名;
        ...
    }结构名;

注意:一般结构体变量存放在堆内存

如何计算结构体的字节数:
    结构体成员的顺序会影响它的总字节数,在设计结构体时如果成员的顺序合理安排,可以大大节约内存,一般结构的总字节数 >= 所有成员的字节数和。
    内存对齐:
        假定第一个成员使用0地址,所有成员所使用的内存地址必须被它的字节数整除,如果不能则填充一些空字节。
    内存补齐:
        结构的总字节数,必须是它最成员的整数倍,如果不是补充一些空字节

总结:成员首地址要能整除成员字节数,如果不能则后移地址至能(对齐),结构体的总字节数是最大成员的字节数的整数倍(补齐),但是如果是Linux系统,则对齐量和补齐量大于4那就会当作4来补齐,所以当成员里面有8个字节的成员时,需要注意计算。

分配地址的写法,无对齐,有补齐

    注意:在Linux系统下结算结构体的对齐和补齐时,如果最大成员的字节数超过4字节,则按照4字节计算,在windows系统按照实际情况计算

    #pragma pack(n)
    设置对齐、补齐的最大字节数, n<=默认 (1,2,4)


结构体全局使用:
例子:
typedef struct Student
{
char name[20];
int id;
float score;
}Student;
Student* stup;

函数:
{
stup=malloc(sizeof(Student)*100);
stup[];//按照数组使用
}

联合:union

联合与结构的使用方法基本一致,与结构的区别是所有成员共用一块内存,一个成员的值发生改变,其他成员的值都随之改变。
联合就是用少量的内存对应多个标识符,从而达到节约内存的目的,但是现在基本不再使用
    联合常考的笔试题:
    union Data
    {
        char ch[5];
        int num;
    };
    注意:计算联合的字节数时,要考虑内存补齐

    系统的大小端:
    小端系统:低位数据存储在低位地址。
    大端系统:低位数据存储在高位地址。
    如何判断系统是大端还是小端?
    假如有一个十六进制数 0x01020304 存储在以0x0A为起始的4字节内存中

    高位数据存储在高位地址:小端系统 (0A:04 0B:03 0C:02 0D:01)
    高位数据存储在低位地址:大端系统 (0A:01 0B:02 0C:03 0D:04)

    个人计算机都是小端系统,而UNIX服务器和网络设备都是大端,网络字节序也是大端模式的数据

枚举:enum

枚举就是一种数据类型,把可能出现的值全部罗列出来,取一个有意义的名字,除此之外,该类型的变量再等于其它数值就是非法的(愿望)        g++编译器会限制

枚举可以看成是值受限的int类型,但是编译器为了效率并不去检查,所以在C语言中枚举也可以当做int类型变量使用

enum Direction {UP=183,DOWN=184,RIGHT=185,LEFT=186};

如果不给成员值,枚举常量的值默认从0开始,逐渐+1,如果给某个枚举常量设置值,后面的会在它的基础上逐渐+1
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值