数据结构——结构体位域、typedef类型重定义、宏、共用体union、枚举、虚拟内存划分

一、结构体位域

  1.1 结构体位域的基础

结构体位域:把结构体字节大小扣到极致的一个类型,以bit单位

格式:
 struct 位域体名
 {
     数据类型 位域名:位域大小;
      数据类型 位域名:位域大小;
      ...
 };
 解析:
 位域体名:可有可无,满足命名规范
 数据类型:只能是整数(char\short\int\long\long long)
 位域名:可有可无,如果不屑,则默认该位不可以使用,结果位0
 位域大小:不可以大于数据类型的总位值
 eg:
     struct A
     {
        int a:10;
        int b:20;
        char c:6;
        ...       
     };
      struct B
     {
        int a:10;
        int :20; //20位不可以使用,默认是0
        char c:6;
        ...       
     };

  1.2 结构体位域的大小

1.结构体位域的各个数据类型一致,且总和小于最宽数据类型的字节大小
  分配字节单位是以最宽数据类型字节大小分配
    struct A
    {
        int a:2;
        int b:3;
        int c:20;    
    };
    结构体分配最宽成员的字节大小,int---->32
    a:2  剩余30bit,  b:3 剩余27  c:20 剩余7位
    共4字节
  2.结构体位域的各个数据类型一致,且总和大于最宽数据类型的字节大小
      不可以跨字节存储
    struct B
    {
        int a:20;
        int b:23;
        int c:7;    
    };
    最宽数据类型int--->32bit
    a:20 剩余12,  b:23不够存储,则需要重新申请4字节存储b
    b:23  剩余9   c:7  剩余2
    共8字节
    3.结构体位域的各个数据类型不一致,且总和大于最宽数据类型的字节大小
        struct C
    {
        char a:7;
        short b:15;
        int c:30;
        long d:20;
        long long e:53;
    };
    最宽long long -->8字节---》64bit
    a:7  剩余57  b:15:42  c:30  剩余12   d:20  重新8字节, 
    剩余44    e:53  重新申请8字节 
    共24字节

  1.3 结构体位域的使用

struct C
    {
        char a:7;   -2^6  2^6-1
        short b:15;  -2^14   2^14-1
        int c:30;    -2^29   2^29-1
        unsigned long d:20;
        long long e:53;
    };
    struct C num={128,20,30,40,50};
    printf("%d",num.a);
   
   char  -128,127
   char a=128  --->a=-128
   char b=129  --->b:-127
   char c=130   --->c:-126
   
   如果数据在赋值时出现数据溢出,则会从最大值到最小值上

二、typedef类型重定义

typedfef: 类型重定义

格式: typedef 数据类型 别名;

1.typedef: 类型重定义

2.数据类型:基类型,构造类型,空类型,指针类型

3.别名:满足命名规范

size_t 在64操作系统unsigned long 32操作系统unsigned int

typedef int size_4; //把int起别名size_4 int--->sise_4

int a;--->size_4 a;

typedef unsigned long size_t;

typedef unsigned int size_t;


    int age;
    char name[100];
}p_t;

方式1:
struct Person a;
typedef struct Person p_t; //struct Person起别名p_t
p_t a;


int a;
int arr[2];
int *p;

typedef int a,arr[2],*p;   a-->int   arr-->int[2]  p-->int*

typedef int a;
typedef float a;
C语言变量
int a;
int arr[3];
int arr[2][3];
int* p;
int** p;
int (*p)[3];
int *p[3]
int (*p)();
int *p()
C类型
int ;
int [3];
int [2][3];
int* ;
int** ;
int (*)[3];
int *[3]
int (*)();
int *()
typedef和类型的结合
typedef int a_t;//a_t类型别名,表示int
typedef int arr_t[3] ;//arr_t类型别名,表示int [3]
    int arr[3]--->arr_t b;
typedef int arr_t[2][3];
typedef int* p_t;
typedef int** p_t;
typedef int (*p_t)[3];
typedef int *p_t[3]
typedef int (*fun_t)();
typedef int *fun_t();

eg:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, const char *argv[])               
{
    typedef int size_4;
    size_4 a=100;
    printf("a=%d\n",a);
    
    typedef  int arr_t[2][3];//arr_t等价int [2][3];
    arr_t b={1,2,3,4,5,6};
    for(int i=0;i<2;i++)
    {
        for(int j=0;j<3;j++)
            printf("%d\t",b[i][j]);
        putchar(10);
    }
    
    return 0;
}

三、宏

宏:宏只做替换,不做计算,不做正确性的检测

宏发生在预处理阶段

3.1 简单宏

格式:#define 宏名 宏体

1.#define 定义宏

2.宏名:满足命名规范,一般大写

3.宏体:默认时字符串

4.宏是没有类型,不需要在最后加;宏不是C语句

5.宏默认是全局,一般定义在主函数的上面

#define A 100
#deifne PAI  3.14
#define CH 'a'
#define STRING "hello"
#define size_4 int  size_4的值int

  3.2 宏函数

    3.2.1 自定义宏函数

1.({})

格式:
#define 宏函数名(参数列表) ({C语句1;C语句2...C语句n})
解析:
1.参数列表:没有数据类型,多个参数之间使用逗号隔开
2.({}):当C语句只有一条时默认可以省略不写
3.({}): 默认存在返回,返回最后一个表达式
4.宏体建议只写一行,换行需要使用\链接父,进行连接

eg:使用宏计算两个数的最大值
#define MAX1(x,y) x>y?x:y

#define MAX(x,y) ({int max;\
        if(x>y)\
        max=x;\
        else \
            max=y;\
        max;})                          
int main(int argc, const char *argv[])
{
    int a=11,b=22;
    int max=MAX(a,b);
    a>b?a:b;
    printf("max=%d\n",max);
    printf("max1=%d\n",MAX1(a,b));
    return 0;
}

2. do{}while(0)

格式:
    #define 宏函数名(参数列表) do{C语句1;C语句2....}while(0)
1.参数列表:没有数据类型,多个参数之间使用逗号隔开
2.do{}while(0) 后面不加分号
3.默认不存在返回
4.宏体建议只写一行,换行需要使用\连接符,进行连接
eg:使用宏计算两个数的最大值
#define MAX(x,y) do{if(x>y)printf("%d",x);else printf("%d",y);}while(0)

    3.2.2 系统自带的宏函数

1.判断宏是否为真,多用注释
    #if 宏名
        C语句1;
    #endif
执行过程:如果宏为真,则执行C语句,否则跳过
2.宏的双分支
    #if 宏名
        C语句1;
    #else
        C语句2;
    #endif
执行流程:如果宏为真则执行C语句1,否则执行C语句2
3.宏的多分支
    #if 宏名1
            C语句1;
    #elif 宏名2
            C语句2;
    ....
    #else
        C语句n;
    #endif
执行流程:如果宏1为真则执行C语句1,结束
    如果宏1为假,则判断宏2,如果宏2为真,则执行C语句2,结束
    以此类推
4.判断宏已经定义
    #ifdef 宏
        C语句1;
        C语句2;
    #endif
执行流程:判断宏已经定义了,如果定义了,则执行C语句
5.判断宏没有定义
    #ifndef 宏
        C语句1;
    #endif
执行流程:判断宏没有定义了,如果没有定义,则执行C语句  
6.判断多个宏已经定义
    #if defined(宏1) &&defined(宏2)
        C语句1;
    #endif
执行流程:判断宏已经定义了,如果定义了,则执行C语句
7.判断多个宏没有定义
    #if !defined(宏)    #if undefined==宏
        C语句1;
    #endif
执行流程:判断宏没有定义了,如果没有定义,则执行C语句    
8.# 把宏体转换为字符串
    #define FUN(a) #a
9,## 连接
    #define FUN(a,b) a##b

#讲解案例:

##的讲解案例:

    3.2.3 多文件编译

1.头文件:预处理命令,全局变量,头文件,函数生命

2.main函数

3.自定义函数

#include <>: 默认在系统库中查找头文件 库路径是/usr/include/

#include "":现在当前目录下查找头文件,找不到则在系统库中查找

  3.3 宏和typedef之间的区别

1.宏发生在预处理阶段,typedef 编译阶段

2.宏不是C语句,typedef是C语句

3.宏属于替换,typedef类型重定义

4.宏只能做基类型的简单替换,typedef可以重定义任何类型

typedef int size_4 typedef int arr[2]

#define size_4 int

四、共用体union

  4.1 认识共用体的格式

union 共用体名
{

 数据类型 变量名;
 数据类型 变量名;
 ····   
};   //定义了一个结构体类型

  4.2 共用体的地址

各个成员变量共享同一片空间

共用体字节大小等于最宽成员的字节大小,满足字节对齐原则

  4.3 共用体的使用

1.当没有指定成员时,默认给第一个成员赋值
typedef union A
{
    int a;
    char b;
    float c;
}A_t;
A_t num={100};   默认给第一个成员a赋值
2.指定成员赋值
A_t num2={.c=3.14};
3.定义变量后赋值
A_t num3;
num3.a=100;
num3.b='a';
num3.c=3.14
此时最终结果是最后一次赋值的结构

  4.4 使用union解决大小端存储

typedef union A
{
    int a;
    char b;
}A_t;
A_t num={0x12345678}
if(num.b==0x78)
    printf("little\n");
else
    printf("big\n");

五、枚举

  5.1 枚举的概念

枚举:防止魔鬼数字

枚举:列举所有集的有序序列的常量集合

枚举属于基类型

#define A 1

#define B 2

#define C 3

enum 枚举名
{
    变量名1,变量名2,....
};
1.enum:枚举关键字
2.枚举名:满足命名规范
3.变量名:没有数据类型,类型是自定义的枚举类型  enum 枚举名

  5.2 枚举的使用

1.默认没有赋值
enum NUM
{
    A,B,C   A默认结果是0,后面的一次递增 
};
printf("A=%d\n",A);
2.指定赋值
enum NUM
{
    A,B=50,C   A默认结果是0,B=50  C=51
};
enum NUM
{
    A=20,B=50,C=31   A默认结果是20,B=50  C=31
};
3.枚举变量
enum NUM
{
    A=20,B=50,C=31   A默认结果是20,B=50  C=31
};
enum NUM a=100;   //a是枚举变量,可以修改,ABC成员不可以修改

六、虚拟内存划分

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/968896.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CZML 格式详解,javascript加载导出CZML文件示例

示例地址&#xff1a;https://dajianshi.blog.csdn.net/article/details/145573994 CZML 格式详解 1. 什么是 CZML&#xff1f; CZML&#xff08;Cesium Zipped Markup Language&#xff09;是一种基于 JSON 的文件格式&#xff0c;用于描述地理空间数据和时间动态场景。它专…

SQL递归技巧

1.读样例 with recursive cet_dpt(id, parent_id, path, org_category, level,depart_name) as (select id ,parent_id,depart_name as path,org_category,1 as level,sd.depart_namefrom isolarerp.sys_depart sdwhere del_flag 0and sd.org_code A09B15union al…

django配置跨域

1、第一种 from django.views.decorators.csrf import csrf_exemptcsrf_exempt第二种 安装 pip install django-cors-headers在配置文件settings.py进入 INSTALLED_APPS [..."corsheaders", # 添加 ]MIDDLEWARE [corsheaders.middleware.CorsMiddleware, # 添加…

设置mysql的主从复制模式

mysql设置主从复制模式似乎很容易&#xff0c;关键在于1&#xff09;主库启用二进制日志&#xff0c;2&#xff09;从库将主库设为主库。另外&#xff0c;主从复制&#xff0c;复制些什么&#xff1f;从我现在获得的还很少的经验来看&#xff0c;复制的内容有表&#xff0c;用户…

蓝耘智算平台:开启企业级 DeepSeek 智能助手的搭建捷径

文章目录 一、深度解密 DeepSeek 技术矩阵1.1 模型架构创新1.2 核心能力全景 二、私有化部署&#xff1a;企业的明智之选2.1 企业级部署场景2.2 硬件选型策略 三、蓝耘平台&#xff1a;部署全流程大揭3.1 环境准备阶段Step 1&#xff1a;访问蓝耘智算云官网完成企业认证Step 2&…

Android原生的HighCPU使用率查杀机制

摘要 原生的HighCPU使用率查杀机制是基于读取/proc/pid/stat中的utime stime后&#xff0c;根据CPU使用率 (utime stime / totalTime)*100%进行实现&#xff0c;当检测后台进程的CPU使用率超过阈值时&#xff0c;执行查杀和统计到电池数据中。 细节点&#xff1a; 1. 原生根…

数据库安全、分布式数据库、反规范化等新技术(高软19)

系列文章目录 3.7数据库安全、分布式数据库、反规范化等新技术 前言 本节数据库安全、分布式数据库、反规范化等新技术相关概念与技术。 一、数据库 1.数据库安全 2.数据库备份 二、分布式数据库 1.数据库分布 2.数据仓库 3.数据仓库结构 4.商业智能&#xff08;BI&#xf…

数据结构实现顺序表的尾插,尾删,按值查找/修改/删除,按下标查找/增加/删除

头文件&#xff1a;head.h #ifndef __HEAD_H__ #define __HEAD_H__#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXSIZE 20enum num {success,false-1};typedef int datatype;typedef struct {int len;datatype data[MAXSIZE]; }S…

新手自学:如何用gromacs对简单分子复合物进行伞形采样

1、建立体系: 1、将蛋白的pdb文件转化为gmx: gmx pdb2gmx -f 2BEG_model1_capped.pdb -ignh -ter -o complex.gro 这个网页可以实现将多肽序列转化为pdb: ProBuilder On-line 这个教程的蛋白2BFG包含两条链(chain A和B) 在生成的topol文件中,增加如下的内容,效果就…

2025 BabitMF 第一期开源有奖活动正式开启 !

为了促进开源社区的交流与成长&#xff0c;字节跳动开源的多媒体处理框架 BabitMF &#xff08;GitHub - BabitMF/bmf: Cross-platform, customizable multimedia/video processing framework. With strong GPU acceleration, heterogeneous design, multi-language support, e…

Ollama 自定义导入模型

文章目录 一、从 GGUF 导入1.1 CCUF 介绍1.2 导入方式 二、由模型直接导入2.1 模型下载2.2 使用 llama.cpp 进行转换&#xff08;1&#xff09;克隆 llama.cpp 库到本地&#xff0c;并安装相关库&#xff08;2&#xff09;环境验证&#xff08;3&#xff09;执行转换程序 2.3 使…

J6 X8B/X3C切换HDR各帧图像

1、OV手册上的切换命令 寄存器为Ox5074 各帧切换&#xff1a; 2、地平线control tool实现切换命令 默认HDR模式出图&#xff1a; HCG出图&#xff1a; LCG出图 SPD出图 VS出图

GESP5级语法知识(十一):高精度算法(一)

高精度加法&#xff1a; #include<iostream> #include<string> #include<algorithm> using namespace std; const int N501;//高精度数的最长长度 //c[]a[]b[]:高精度加法方案一&#xff1a;对应位相加&#xff0c;同时处理进位 void h_add_1(int a[],int b…

【Git版本控制器】:第二弹——工作区,暂存区,版本库,

&#x1f381;个人主页&#xff1a;我们的五年 &#x1f50d;系列专栏&#xff1a;Linux网络编程 &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 ​ 相关笔记&#xff1a; https://blog.csdn.net/djd…

Transformer 模型介绍(一)——综述

Transformer 是一种完全基于注意力机制的神经网络模型&#xff0c;首次在2017年的论文《Attention Is All You Need》中提出。该模型最初用于机器翻译任务&#xff0c;并在特定任务中表现优于谷歌的其他神经网络机器翻译模型。Transformer 也是 Seq2Seq&#xff08;序列到序列&…

【Linux】多线程 -> 从线程概念到线程控制

线程概念 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“一个进程内部的控制序列”。一切进程至少都有一个执行线程。线程在进程内部运行&#xff0c;本质是在进程地址空间内运行。在Linux系统中&#xff0c;在CPU眼…

.NET Web-静态文件访问目录浏览

一、Web根目录访问 创建wwwroot文件夹app.UseStaticFiles(); // 启⽤静态⽂件中间件url/路径 进行访问 二、Web根目录之外的文件 app.UseStaticFiles(new StaticFileOptions {FileProvider new PhysicalFileProvider(Path.Combine(builder.Environment.ContentRootPath,&qu…

cap1:TensorRT是什么?

文章目录 1、什么是 TensorRT&#xff1f;2、TensorRT 的优势3、TensorRT 加速 PyTorch 模型的基本流程3.1 训练模型和保存模型3.2 导出模型3.3 转换为 TensorRT 引擎3.4 加载与推理 4、基础环境配置4.1 安装nvidia驱动4.2 安装CUDA4.3 安装cuDNN 在软件工程领域&#xff0c;部…

JVM——堆的回收:引用计数发和可达性分析法、五种对象引用

目录 引用计数法和可达性分析法 引用计数法&#xff1a; 可达性分析算法&#xff1a; 五种对象引用 软引用&#xff1a; 弱引用&#xff1a; 引用计数法和可达性分析法 引用计数法&#xff1a; 引用计数法会为每个对象维护一个引用计数器&#xff0c;当对象被引用时加1&…

云计算实训室解决方案(2025年最新版)

一、中高职及本科院校在云计算专业建设中面临的挑战 随着大数据、信息安全、人工智能等新兴信息技术产业的快速发展&#xff0c;相关领域人才需求激增&#xff0c;许多本科及职业院校纷纷开设云计算及相关专业方向。 然而&#xff0c;大多数院校在专业建设过程中面临以下困难&…