成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

STM32編程中枚舉和結(jié)構(gòu)體的結(jié)合

開發(fā) 前端
結(jié)構(gòu)體,通俗講就像是打包封裝,把一些有共同特征(比如同屬于某一類事物的屬性,往往是某種業(yè)務(wù)相關(guān)屬性的聚合)的變量封裝在內(nèi)部,通過一定方法訪問修改內(nèi)部變量。

01 結(jié)構(gòu)體定義

基本定義:結(jié)構(gòu)體,通俗講就像是打包封裝,把一些有共同特征(比如同屬于某一類事物的屬性,往往是某種業(yè)務(wù)相關(guān)屬性的聚合)的變量封裝在內(nèi)部,通過一定方法訪問修改內(nèi)部變量。

結(jié)構(gòu)體的定義:

第一種:只有結(jié)構(gòu)體定義

  1. struct stuff{   
  2.   char *name;  //姓名 
  3.   int num;  //學(xué)號(hào) 
  4.   int age;  //年齡 
  5.   float score;  //成績(jī) 
  6. }; 

第二種:附加該結(jié)構(gòu)體類型的“結(jié)構(gòu)體變量”的初始化的結(jié)構(gòu)體定義,如下代碼也就是定義結(jié)構(gòu)體時(shí),直接定義一個(gè)變量

  1. struct stuff{   
  2.   char *name;  //姓名 
  3.   int num;  //學(xué)號(hào) 
  4.   int age;  //年齡 
  5.   float score;  //成績(jī) 
  6. }xiaoming; 

其實(shí)這就相當(dāng)于先定義結(jié)構(gòu)體,再用結(jié)構(gòu)體定義一個(gè)結(jié)構(gòu)體變量:

  1. struct stuff{   
  2.   char *name;  //姓名 
  3.   int num;  //學(xué)號(hào) 
  4.   int age;  //年齡 
  5.   float score;  //成績(jī)  
  6. };   
  7. struct stuff xiaoming;   

第三種:使用typedef關(guān)鍵字,可以將結(jié)構(gòu)體變量定義時(shí)少寫一個(gè)struct,比較省事。

  1. typedef struct stuff{   
  2.   char *name;  //姓名 
  3.   int num;  //學(xué)號(hào) 
  4.   int age;  //年齡 
  5.   float score;  //成績(jī)  
  6. }stuff_s;   
  7. stuff_s xiaoming; 

使用typedef還可以進(jìn)一步簡(jiǎn)化,將結(jié)構(gòu)體名也省略,這也是常用的方式

  1. typedef struct{   
  2.   char *name;  //姓名 
  3.   int num;  //學(xué)號(hào) 
  4.   int age;  //年齡 
  5.   float score;  //成績(jī)  
  6. }stuff_s;   
  7. stuff_s xiaoming; 

STM32的標(biāo)準(zhǔn)外設(shè)庫有大量這樣的應(yīng)用,如下

  1. typedef struct 
  2.   uint32_t GPIO_Pin; 
  3.   GPIOMode_TypeDef GPIO_Mode; 
  4.   GPIOSpeed_TypeDef GPIO_Speed; 
  5.   GPIOOType_TypeDef GPIO_OType; 
  6.   GPIOPuPd_TypeDef GPIO_PuPd; 
  7. }GPIO_InitTypeDef; 

關(guān)于結(jié)構(gòu)體指針定義問題,有很多的“騷操作”的寫法,我一般按照下面定義指針

  1. stuff_s *cuerrent_student; 

02 結(jié)構(gòu)體初始化

在大部分應(yīng)用中,一般都是定義結(jié)構(gòu)體后,在代碼中進(jìn)行初始化,如下所示

  1. typedef struct{   
  2.   char *name;  //姓名 
  3.   int num;  //學(xué)號(hào) 
  4.   int age;  //年齡 
  5.   float score;  //成績(jī)  
  6. }stuff_s; 
  7. stuff_s xiaoming; 
  8. void xiaoming_inf_init() 
  9.   xiaoming.name = "xiaoming"
  10.   xiaoming.num = 1; 
  11.   xiaoming.age = 18.0; 
  12.   xiaoming.score = 100; 

當(dāng)然也有可以定義時(shí)就進(jìn)行數(shù)據(jù)初始化的

  1. typedef struct{   
  2.   char *name;  //姓名 
  3.   int num;  //學(xué)號(hào) 
  4.   int age;  //年齡 
  5.   float score;  //成績(jī)  
  6. }stuff_s; 
  7. stuff_s xiaoming={"xiaoming",1,18.0,100}; 

C99和C11為結(jié)構(gòu)提供了指定初始化器(designatedinitializer)。其初始化器使用點(diǎn)運(yùn)算符和成員名。

關(guān)于C99和C11的知識(shí)可以看我之前的文章《C語言的發(fā)展》,在IAR和Keil中記得勾選C99的選項(xiàng)。

例如,只初始化xiaoming結(jié)構(gòu)中的name成員,可以這樣做:

  1. stuff_s xiaoming= 
  2.   .name = "xiaoming" 
  3. }; 

也可以按照任意順序使用指定初始化器:

  1. stuff_s xiaoming= 
  2.   .age = 18.0, 
  3.   .name = "xiaoming" 
  4. }; 

這樣的賦值方式,在linux方式中很常見,以platform驅(qū)動(dòng)框架為例:

  1. static struct platform_driver leds_platform_driver = { 
  2.   .driver = { 
  3.     .name = "imx6ul-led"
  4.     .of_match_table = leds_of_match, 
  5.   }, 
  6.   .probe = leds_probe, 
  7.   .remove = leds_remove, 
  8. }; 

03 訪問結(jié)構(gòu)體成員

結(jié)構(gòu)體成員的訪問需要借助結(jié)構(gòu)體成員運(yùn)算符(.),如下

  1. stuff_s xiaoming,xiaohong; 
  2. void student_inf_init() 
  3.   xiaoming.name = "xiaoming"
  4.   xiaoming.num = 1; 
  5.   xiaoming.age = 18.0; 
  6.   xiaoming.score = 100; 
  7.    
  8.    
  9.   xiaohong.name = "xiaohong"
  10.   xiaohong.num = xiaoming.num+1; 

使用指針時(shí),使用(->)符號(hào)訪問結(jié)構(gòu)體成員

  1. stuff_s xiaoming,xiaohong; 
  2. stuff_s *cuerrent_student; 
  3. void student_inf_init() 
  4.   xiaoming.name = "xiaoming"
  5.   xiaoming.num = 1; 
  6.   xiaoming.age = 18.0; 
  7.   xiaoming.score = 100; 
  8.   cuerrent_student = &xiaohong; 
  9.    
  10.    
  11.   cuerrent_student->name = "xiaohong"
  12.   cuerrent_student->num = xiaoming.num+1; 

04 枚舉與結(jié)構(gòu)體的結(jié)合

簡(jiǎn)單介紹下枚舉:有些數(shù)據(jù)的取值往往是有限的,只能是非常少量的整數(shù),并且最好為每個(gè)值都取一個(gè)名字,以方便在后續(xù)代碼中使用,比如一個(gè)星期只有七天,一年只有十二個(gè)月,一個(gè)班每周有六門課程等。

當(dāng)然,你可以用宏定義

  1. #define Mon 1 
  2. #define Tues 2 
  3. #define Wed 3 
  4. #define Thurs 4 
  5. #define Fri 5 
  6. #define Sat 6 
  7. #define Sun 7 

如果用了枚舉則如下

  1. enum week{ 
  2.   Mon, 
  3.   Tues, 
  4.   Wed, 
  5.   Thurs, 
  6.   Fri, 
  7.   Sat, 
  8.   Sun 
  9. }; 

枚舉是一種類型,通過它可以定義枚舉變量:

  1. enum week a, b, c; 

那么枚舉和結(jié)構(gòu)體一起用會(huì)產(chǎn)生什么效果呢?假設(shè)我們要協(xié)議一個(gè)語音芯片的驅(qū)動(dòng),需要表示語音芯片的狀態(tài)

  1. typedef enum//語音芯片狀態(tài) 
  2.     VOICE_INIT_OK =            0x4A,  //語音芯片上電初始化成功后,自動(dòng)回傳命令 
  3.     VOICE_RECEIVE_OK =           0x41,  //語音芯片收到正確的命令幀 
  4.     VOICE_ORDER_ERROR=         0x45,  //語音收到錯(cuò)誤的命令幀 
  5.     VOICE_BUSY     =            0x4E,  //語音忙(正在合成狀態(tài)) 
  6.     VOICE_FREE     =           0x4F  //語音空閑 
  7. } VOICE_STATUS; 
  8. typedef struct { 
  9.     VOICE_STATUS status ;                 //!< 語音芯片狀態(tài) 
  10.     Ouint32  delayTicks;                   //!< 播放時(shí)間 
  11.     Ouint32  playtimes;                    //!< 播放次數(shù) 
  12. } voicechip_Para_S; 
  13. voicechip_Para_S voicechip_Para; 

那么改變語音芯片狀態(tài)時(shí),我們可以按照下面這樣寫

  1. voicechip_Para.status = VOICE_RECEIVE_OK; 

判斷語音芯片狀態(tài)時(shí),我們可以按照下面寫

  1. if((voicechip_Para.status == VOICE_FREE) 

當(dāng)然,你用宏定義是可以的,代碼也很整潔。這里希望你能理解文章最開始的那句話:結(jié)構(gòu)體是某種業(yè)務(wù)相關(guān)屬性的聚合。

05 騷操作

關(guān)于結(jié)構(gòu)體有很多騷操作,如果全部總結(jié)下來,這篇文章就會(huì)很臃腫,例如結(jié)構(gòu)體嵌套的騷操作,可以一邊定義結(jié)構(gòu)體B,一邊就使用上:

  1. struct A{   
  2.     struct B{   
  3. int c;   
  4.     }b;   
  5.     struct B sb;   
  6. }a; 

對(duì)于這樣的情況,我一般主張能看懂就行,自己寫代碼時(shí)就少點(diǎn)這樣的騷操作

  1. struct B{   
  2.      int c;   
  3. }b; 
  4. struct A{   
  5.      struct B sb;   
  6. }a; 

 

責(zé)任編輯:姜華 來源: 知曉編程
相關(guān)推薦

2011-04-11 13:00:08

C++結(jié)構(gòu)體枚舉

2021-04-22 08:39:23

哈佛結(jié)構(gòu)馮洛伊曼結(jié)構(gòu)ARM架構(gòu)

2022-10-10 08:24:15

編程數(shù)據(jù)邏輯語句

2021-12-22 06:56:07

STM32C語言內(nèi)存

2021-08-26 06:29:47

STM32DWT數(shù)據(jù)觀察點(diǎn)觸發(fā)

2021-08-31 08:01:40

STM32DSP指令

2021-05-20 07:26:22

DMASTM32數(shù)據(jù)

2021-05-06 08:54:39

串口DMASTM32

2021-02-05 08:41:44

STM32網(wǎng)絡(luò)中斷

2021-01-20 09:51:25

STM32網(wǎng)絡(luò)接口

2020-12-02 09:10:22

Go結(jié)構(gòu)數(shù)據(jù)類型

2022-07-25 14:31:55

LiteOS開發(fā)工具

2021-06-26 07:50:20

STM32串口開發(fā)環(huán)形緩沖區(qū)

2021-02-03 13:04:24

STM32網(wǎng)絡(luò)控制器

2018-10-15 10:15:30

STM32Linux經(jīng)驗(yàn)

2024-01-02 10:54:07

Rust結(jié)構(gòu)體元組

2021-02-26 08:46:46

PHY寄存器網(wǎng)絡(luò)

2011-07-20 14:45:43

C++結(jié)構(gòu)體

2021-08-04 08:33:59

TypeScriptConst Readonly

2020-01-10 22:51:30

硬件軟件人生第一份工作
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 高清视频一区 | 日日摸日日添日日躁av | 日韩精品视频一区二区三区 | 91视频大全 | 伊人网影院 | 日韩欧美成人精品 | 国产婷婷精品 | 日韩电影免费在线观看中文字幕 | 黄色片网站国产 | 亚洲小视频在线观看 | 特级一级黄色片 | 91精品国产91久久久久久吃药 | 久久九九影视 | 最新中文字幕在线 | 亚洲精品大全 | 99精品久久久久久久 | 久久久精品国产 | 中文字幕成人网 | 美女视频一区 | 中文字幕国产视频 | 天天视频一区二区三区 | 欧美精品一区二区三区四区 在线 | 1000部精品久久久久久久久 | 欧美a在线 | 91国产在线视频在线 | 国产一区二区三区久久久久久久久 | 天天操 夜夜操 | 日韩高清成人 | 日韩一区二区福利 | 欧美一区不卡 | 精品久久久久一区二区国产 | 精品美女视频在线观看免费软件 | 人人射人人 | www.av在线| 喷水毛片 | 日韩午夜| 国产a区 | 久久天天躁狠狠躁夜夜躁2014 | 久久久久久黄 | 99精品久久久久久中文字幕 | 亚洲男人天堂 |