首页 > 其他分享 >结构体&&联合&&枚举(详解版)

结构体&&联合&&枚举(详解版)

时间:2024-03-22 11:02:20浏览次数:17  
标签:字节 int 成员 位段 枚举 详解 && 对齐

1.结构体

        1.结构体的声明

struct tag
{
 member-list;
}variable-list;

        2.结构体的特殊声明

struct
{
int a;
char b;
float c;
}x;
struct
{
int a;
char b;
float c;
}a[20], *p;
 

                上述代码属于匿名结构体类型 

                1)编译器会把上面的生命当成完全不同的类型所以是非法的

                2)匿名的结构体类型,只能使用一次,因为没有对结构体类型重命名

        3.结构体的自引用方式

        如果一个结构体内部包含同类型的结构体变量,结构体变量的大小就会无穷的大

        所以正确的自引用方式是使用指指针:

 struct Node
{
    int data;
    struct Node* next;
};

        4.结构体的内存对齐

        对齐规则:

                        1.结构体的第一个成员对齐到和结构体变量起始位置偏移量是0的地址处

                        2.其他成员变量对齐到对齐数的整数倍的地址处去

                           对齐数是编译器默认的一个对齐数与该成员变量大小的较小值

                        3.结构体总大小为最大的对齐数的整数倍

例:

struct S1
{
 char c1;
 int i;
 char c2;
};
printf("%d\n", sizeof(struct S1));
c1从零偏移位置处开始占一个字节,接着往下看,i是int类型占4个字节,对齐数是4,所以i从偏移量为4的位置处存,c2对齐数是1,在i后面存,现在是九个字节,由于最大对齐数是4,根据规则4,结构体需要占12个字节空间才可以。         为什么要存在内存对齐:1)平台原因        2)性能原因         修改对齐数:          #progma pack(x)这个预处理指令,可以改变编译器的默认对齐数为x         取消默认对齐数,使用 #progma pack()

        5.结构体位段

        位段的声明与结构体类似:

        1)位段的成员必须是int,unsigned int 或者signed int

        2)   位段的成员名后必须有一个冒号和数字

        3)  可移植程序避免使用位段

        4)   位段的空间是按照4个字节或者1个字节的方式来开辟的

        5)  位段可以节省空间

struct A
{
 int _a:2;
 int _b:5;
 int _c:10;
 int _d:30;
};
        位段的注意事项:位段的几个成员共有一个字节,这样有些成员的起始位置并不是某个字节的起始位置,那么这些位置处是没有地址的,内存中每个字节分配一个地址,一个字节的内部的bit位是没有地址的         不能对位段成员使用&操作符,而应该是先输入放在一个变量中,然后赋值给位段的成员

2.联合

        1.联合体类型的声明

                联合体也是由一个或者多个成员构成,可以是不同类型。联合体的特点是所有成员共用一块空间。给一个成员赋值,其他成员的值也跟着变化。

        2.联合体的特点

                联合体的大小,至少是最大成员的大小

        3.联合体大小的计算

                联合的大小至少是最大成员的大小

                当最大成员大小不是最大对齐数的整数倍的时候,就要对齐到最大对齐数的整数倍。

        4.联合体的一个练习(判断当前机器的大小端)

                

int check_sys()
{
 union
 {
 int i;
 char c;
 }un;
 un.i = 1;
 return un.c;//返回1是⼩端,返回0是⼤端
}

3.枚举

        1.枚举类型的声明

                把可能的取值一一列举

enum Day//星期
{
 Mon,
 Tues,
 Wed,
 Thur,
 Fri,
 Sat,
 Sun
};

        2.枚举的优点

                增加代码的可读性和可维护性

                和#define定义的标识符比较枚举有类型检查,更加严谨

                便于调试,预处理阶段会删除define定义的符号

                枚举常量是遵循作用域规则的,枚举声明在函数内,只能在函数内使用

        3.枚举类型的使用(在C语言中是可以拿整数给枚举变量赋值的)

enum Color//颜⾊
 {
 RED=1,
 GREEN=2,
BLUE=4
 };

 enum Color clr = GREEN;

标签:字节,int,成员,位段,枚举,详解,&&,对齐
From: https://blog.csdn.net/m0_73425221/article/details/136892594

相关文章

  • 邻接矩阵详解
    邻接矩阵是图论中用于表示图(Graph)结构的一种重要数据结构,特别适用于表示顶点之间连接关系的图形。在计算机科学和数学领域,它被广泛应用来编码无向图和有向图的信息。对于一个具有n个顶点的图G=(V,E),邻接矩阵是一个n×n的矩阵A,其中的行和列分别对应着图中的每个顶点。矩......
  • burpsuit插件Turbo Intruder:突破速率限制详解
    一、插件介绍Turbo Intruder是一个BurpSuite扩展插件,用于发送大量HTTP请求并分析结果,可拥抱十亿请求攻击。它旨在处理那些需要异常速度、持续时间或复杂性的攻击来补充Burp Intruder。二、插件原理使用第一次请求的时候就建立好连接,后续获取资源都是通过这条连接来获取资......
  • 对象Constructor构造函数解析详解
    构造函数解析构造函数解析示例,code如下。定义实体类:packagecom.gientech.constructor;publicclassPerson{privateStringname;privateintid;privateintage;privateStringsex;publicPerson(){}publicPerson(String......
  • 二叉树详解
    二叉树详解一:什么是树1:概念2:树的特点##3:树的一些重要概念二:二叉树1:二叉树的概念2:二叉树的特点3:特殊的二叉树:三:二叉树的性质四:二叉树的存储一:什么是树1:概念树是一种非线性的数据结构,它是由n个节点组成的一个具有层次关系的集合,把它叫做树的原因是因......
  • ConcurrentHashMap底层详解
    ConcurrentHashMap是线程安全且高效的HashMap。一、使用原因在并发编程中使用HashMap可能导致程序死循环。而使用线程安全的HashTable效率又非常低下,基于此产生了ConcurrentHashMap。1.线程不安全的HashMap在多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率......
  • nmon监控工具使用方法详解
    在信息化时代,系统监控对于确保服务器和应用的稳定运行至关重要。nmon(Nigel’sMonitor)作为一款强大的性能监控工具,以其直观、全面的监控能力,赢得了众多系统管理员的青睐。本文将详细介绍nmon监控工具的使用方法,帮助读者更好地利用这一工具,提升系统监控效率。一、nmon监控工......
  • JavaScript初识及基本语法详解
    JavaScript是一种轻量级的解释型或即时编译型的编程语言。它最初被设计为在浏览器中用于与网页进行交互,但随着时间的推移,它已经成为了后端开发、游戏开发、桌面应用开发等多个领域的重要工具。1.JavaScript初识1.1历史与用途历史:由BrendanEich在1995年开发,最初......
  • 多线程并发聊天室简单实现代码详解 -- 涉及网络编程,多线程和线程同步的知识
            本项目主要完成多线程并发聊天室的基础功能,即多个客户端之间通过服务器可以实现群发消息,重点在于学习网络编程,多线程和线程同步的基础知识(基于Linux)。    下面我会详解每一部分的代码。1.主线程        1.1首先由于是自己在电脑里面测试,......
  • B树B+树,字典树详解,哈夫曼树博弈树
    目录B树:B-TreeB+树字典树:TrieTree 哈夫曼树博弈树B树:B-Tree多路平衡搜索树1.M阶B树,就是M叉(M个指针)。2.每个节点内记录个数<=M-1。3.根节点记录个数>=1。4.其余节点内记录个数>=ceil(m/2)-1(向上取整)。5.每个节点内的记录从左至右从大到小有序。6.当前记录的左......
  • Impostors详解——纸片构筑的美丽幻觉
    【USparkle专栏】如果你深怀绝技,爱“搞点研究”,乐于分享也博采众长,我们期待你的加入,让智慧的火花碰撞交织,让知识的传递生生不息!写在前面早前,我截帧分析了《CallofDragons》,具体内容可以看《〈CallofDragons〉渲染截帧分析与迷思》,在其中提到了《CallofDragons》中使用......