首页 > 其他分享 >C语言中的struct结构体、union联合体、enum枚举和typedef

C语言中的struct结构体、union联合体、enum枚举和typedef

时间:2023-12-06 14:45:47浏览次数:40  
标签:typedef struct union 枚举 ADC 结构 ID 定义

C语言中的struct结构体、union联合体、enum枚举和typedef

结构体struct

结构体是C编程中另一种用户自定义的可用的数据类型,它允许存储不同类型的数据项。
结构体中的数据成员可以是基本数据类型(如 int、float、char等),也可以是其他结构体类型、指针类型等。

关键字:struct

struct结构体的一般格式如下:(引自:菜鸟教程)

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

1. 结构体的定义

有以下几种不同的定义结构体的方式:

(1) 先定义结构体(显式定义),后定义结构体变量

struct set_of_mdata
{
    int     mdata1;
    float   mdata2;
    char    mdata3;
    double  mdata4[4];
};
struct set_of_mdata som1, som2; //定义结构体变量

(2) 定义结构体(显式定义)的同时定义结构体变量,还可以再次使用结构体声明变量

struct set_of_mdata
{
    int     mdata1;
    float   mdata2;
    char    mdata3;
    double  mdata4[4];
} som1, som2;
struct set_of_mdata som3;

(3) 定义结构体(隐式定义)的同时定义结构体变量,不可以再次使用结构体声明变量

struct
{
    int     mdata1;
    float   mdata2;
    char    mdata3;
    double  mdata4[4];
} som1, som2;

(4) 使用typedef为结构体起别名(显式定义),通过别名定义结构体变量

typedef struct
{
    int     mdata1;
    float   mdata2;
    char    mdata3;
    double  mdata4[4];
} mdata_def;
mdata_def som1, som2;

2. 对结构体的一些操作

通过下面一段代码,来了解一下如何对结构体进行赋值和操作:

#include <stdio.h>

//定义结构体
struct set_of_mdata
{
    int     mdata1;
    float   mdata2;
    char    mdata3;
    double  mdata4[4];
};
struct set_of_mdata som = {10, 3.14, 'd', {2.0, 3.0, 4.0, 5.0}}; //在定义结构体变量时进行初始化

int main()
{
    //通过.运算符访问或修改结构体成员
    printf("mdata1:%d \n", som.mdata1);
    printf("mdata2:%f \n", som.mdata2);
    printf("mdata3:%c \n", som.mdata3);
    printf("mdata4:%f \n", som.mdata4[2]);
    //定义指向结构体的指针
    struct set_of_mdata *mdata_ptr = &som;
    //通过->运算符访问或修改结构体指针所指结构体的成员
    mdata_ptr->mdata1 = 150;
    mdata_ptr->mdata2 = 6.28;
    printf("mdata1:%d \n", mdata_ptr->mdata1);
    printf("mdata2:%f \n", mdata_ptr->mdata2);
}

输出结果如下:
代码运行结果

知识点:
(1) 结构体成员的初始化
在定义结构体变量的同时,通过花括号{value1, value2,...}赋给该结构体成员初始值。

(2) 访问结构体成员
通过.运算符访问或修改结构体成员。

(3) 定义指向结构体的指针
和普通变量的指针定义方式相同。

(4) 结构体指针访问成员
通过->运算符访问或修改结构体指针所指结构体的成员。

3. 结构体的大小

联合体union

联合体是类似结构体struct的一种数据结构,两者的区别在于联合体的成员共享同一个内存位置,也就是说,联合体中的所有成员都是从相同的内存地址开始。
一个union联合体只配置一个足够大的空间以来容纳最大长度的数据成员

关键字:union

1. 联合体的定义

在定义上和结构体完全相同,将struct关键字改为union关键字即可。

(1) 先定义联合体(显式定义),后定义联合体变量

union udata
{
    float ud1;
    char  ud2[3];
};
union udata udata1, udata2;

(2) 定义联合体(显式定义)的同时定义联合体变量,还可以再次使用联合体声明变量

union udata
{
    float ud1;
    char  ud2[3];
}udata1, udata2;
union udata udata3;

(3) 定义联合体(隐式定义)的同时定义联合体变量,不可以再次使用联合体声明变量

union
{
    float ud1;
    char  ud2[3];
}udata1, udata2;

(4) 使用typedef为联合体起别名(显式定义),通过别名定义联合体变量

typedef union
{
    float ud1;
    char  ud2[3];
}udata_def;
udata_def udata1, udata2;

2.对联合体的一些操作

操作与结构体的操作完全相同。参考对结构体的一些操作一节。

3. 联合体的大小

枚举enum

枚举是 C 语言中的一种基本数据类型,用于定义一组具有离散值的常量,它可以让数据更简洁,更易读。
每个枚举常量可以用一个标识符来表示,也可以为它们指定一个整数值,如果没有指定,那么默认从 0 开始递增。

关键字:enum

枚举类型经常用于定义各种状态,用作函数的返回值,来指示函数的行为。

下面是STM32官方库的一些枚举类型的定义:

//GPIO Bit SET and Bit RESET enumeration
typedef enum
{
  GPIO_PIN_RESET = 0U,
  GPIO_PIN_SET
} GPIO_PinState;

//HAL ADC Callback ID enumeration definition
typedef enum
{
  HAL_ADC_CONVERSION_COMPLETE_CB_ID     = 0x00U,  /*!< ADC conversion complete callback ID */
  HAL_ADC_CONVERSION_HALF_CB_ID         = 0x01U,  /*!< ADC conversion DMA half-transfer callback ID */
  HAL_ADC_LEVEL_OUT_OF_WINDOW_1_CB_ID   = 0x02U,  /*!< ADC analog watchdog 1 callback ID */
  HAL_ADC_ERROR_CB_ID                   = 0x03U,  /*!< ADC error callback ID */
  HAL_ADC_INJ_CONVERSION_COMPLETE_CB_ID = 0x04U,  /*!< ADC group injected conversion complete callback ID */
  HAL_ADC_INJ_QUEUE_OVEFLOW_CB_ID       = 0x05U,  /*!< ADC group injected context queue overflow callback ID */
  HAL_ADC_LEVEL_OUT_OF_WINDOW_2_CB_ID   = 0x06U,  /*!< ADC analog watchdog 2 callback ID */
  HAL_ADC_LEVEL_OUT_OF_WINDOW_3_CB_ID   = 0x07U,  /*!< ADC analog watchdog 3 callback ID */
  HAL_ADC_END_OF_SAMPLING_CB_ID         = 0x08U,  /*!< ADC end of sampling callback ID */
  HAL_ADC_MSPINIT_CB_ID                 = 0x09U,  /*!< ADC Msp Init callback ID          */
  HAL_ADC_MSPDEINIT_CB_ID               = 0x0AU   /*!< ADC Msp DeInit callback ID        */
} HAL_ADC_CallbackIDTypeDef

1. 枚举类型的定义

枚举类型的定义一般为:

enum 枚举类型 {枚举值1, 枚举值2, ......};

区别点:枚举类型花括号里的值是使用逗号,分隔的,而结构体和联合体是使用;分隔的。

(1) 先定义枚举类型(显式定义),后定义枚举变量

enum STATE
{
    OK      = 0 ,
    WARN        ,
    ERROR       ,
    STOP
};
enum STATE mState;

(2) 定义枚举类型(显式定义)的同时定义枚举变量,还可以再次使用枚举类型声明变量

enum STATE
{
    OK      = 0 ,
    WARN        ,
    ERROR       ,
    STOP
}mState1;
enum STATE mState2;

(3) 定义枚举类型(隐式定义)的同时定义枚举变量,不可以再次使用枚举类型声明变量

enum
{
    OK      = 0 ,
    WARN        ,
    ERROR       ,
    STOP
}mState1;

(4) 使用typedef为枚举类型起别名(显式定义),通过别名定义枚举变量

typedef enum
{
    OK      = 0 ,
    WARN        ,
    ERROR       ,
    STOP
} STATE_DEF;
STATE_DEF mState1, mState2;

枚举类型中的枚举值的标识符是唯一的,不能与其他宏定义标识符重名。

2. 对枚举类型的一些操作

(1) 初始化枚举变量,在定义的时候进行初始化

typedef enum
{
    OK      = 0 ,
    WARN        ,
    ERROR       ,
    STOP
} STATE_DEF;
STATE_DEF mState1 = WARN;
STATE_DEF mState2 = OK;

(2) 在程序当中修改枚举变量

typedef enum
{
    OK      = 0 ,
    WARN        ,
    ERROR       ,
    STOP
} STATE_DEF;
STATE_DEF mState1 = WARN;

mState1 = OK;   //在程序当中修改枚举变量

3. 枚举类型的大小

标签:typedef,struct,union,枚举,ADC,结构,ID,定义
From: https://www.cnblogs.com/haostudio/p/17879497.html

相关文章

  • springboot @PostConstruct无效的解决
    springboot@PostConstruct无效的解决问题描述:在使用SpringBoot框架时,通过@PostConstruct注解修饰的方法可能会出现无法执行的情况。解决过程:1.确认依赖首先,我们需要确认在项目中是否引入了正确的依赖。在pom.xml文件中,需要引入spring-boot-starter-web包,这个包中含......
  • @PostConstruct 注解不生效的问题
    @PostConstruct注解不生效的问题1、从JavaEE5规范开始,Servlet中增加了两个影响Servlet生命周期的注解,@PostConstruct和@PreDestroy,这两个注解被用来修饰一个非静态的void()方法。写法有如下两种方式:@PostConstructpublicvoidsomeMethod(){}或者public@PostConstructvoi......
  • mapstruct 高级用法自定义转换规则
    https://svip888.blog.csdn.net/article/details/115706803?spm=1001.2101.3001.6650.15&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-15-115706803-blog-117566307.235%5Ev39%5Epc_relevant_3m_sort_dl_base3&depth_1-utm_sourc......
  • Unevictable LRU Infrastructure (翻译 by chatgpt)
    原文:https://www.kernel.org/doc/html/latest/mm/unevictable-lru.htmlIntroductionThisdocumentdescribestheLinuxmemorymanager's"UnevictableLRU"infrastructureandtheuseofthistomanageseveraltypesof"unevictable"folios......
  • Unity DOTS系列之Struct Change核心机制分析
    最近DOTS发布了正式的版本,我们来分享一下DOTS里面StructChange机制,方便大家上手学习掌握UnityDOTS开发。基于ArchType与Chunk的Entity管理机制我们回顾以下ECS的内存管理核心机制,基于ArchType+Chunk的Entity管理模式。每个Entity不直接存放数据,数据全部存放到ComponentData......
  • std::is_trivially_destructible的作用
    template<classTy>voiddestroy(Ty*pointer){destroy_one(pointer,std::is_trivially_destructible<Ty>{});}这样设计的好处主要体现在对泛型编程和内存管理的灵活性上。下面是一些可能的好处:1.**泛型性质:这种设计允许`destroy_one`在不同的上下文中使用,因为它是模......
  • typedef和#define
    typedef工具是一个高级数据特性,利用typedef可以为某一类型自定义名称(起别名)。这方面和#define类似,但二者有三处不同:1、 与#define不同,typedef创建的符号名只受限于类型(只能作为类型),不能用于值。2、 typedef由编译器解释,不是预处理器。3、 在受限范围内,typedef比#define更加灵......
  • union和union all区别
    union:对两个结果集进行并集操作,不包括重复行,同时进行默认规则的排序;unionAll:对两个结果集进行并集操作,包括重复行,不进行排序; 下面进行简单的测试(因为是测试,所以sql代码写的很简单,没有什么很严格的规范,只是为了理解这两者之间的区别)严格的标准写法应该先判断数据库是否存在,表......
  • dwva 的SQL注入一关解决” Illegal mix of collations for operation ‘UNION’“ 问
    我是在phpstudy上面搭建的dvwa背景是我在一天晚上练习SQL注入出现了”Illegalmixofcollationsforoperation‘UNION’“问题就在网上搜索解决办法,发现是因为users表和table表的编码方式不一样导致的网上查到了table_name的排序编码,然后下载解压phpMyAdmin放到WWW目录下......
  • 论文:Predicting the performance of green stormwater infrastructure using multivar
    题目“Predictingtheperformanceofgreenstormwaterinfrastructureusingmultivariatelongshort-termmemory(LSTM)neuralnetwork”(AlMehedi等,2023,p.1)(pdf)“基于多元长短期记忆(LSTM)神经网络的绿色雨水基础设施性能预测”(AlMehedi等,2023,pp.-)......