網站首頁 編程語言 正文
一、結構體的概念
比如說學生的信息,包含了學生名稱、學號、性別、年齡等信息,這些參數可能有些是數組型、字符型、整型、甚至是結構體類型的數據。雖然這些都是不同類型的數據,但是這些都是用來表達學生信息的數據。
二、結構體的用法
1、struct 結構體名稱 訪問方法: 結構體變量名.成員
{undefined 成員1; 成員2; };
2、 typedef struct
{undefined 成員1; 成員2; }結構體名稱;
在中大型產品中一般用第2種,因為結構體多了以后通過別名的方式定義結構體變量能夠大大提高代碼可讀性。
三、結構體數組和指針
- 1、直接用struct聲明一個結構體,然后在定義結構體數組,struct 結構體名稱 數組名[數組大小]
- 2、用
typedef struct
聲明一個結構體,并且為結構體重命名,通過重命名的方法定義結構體數組。結構體重命名 數組名[數組大小]
四、結構體指針
只要是存儲在內存中的變量或者數組或函數編譯器都會為他們分配一個地址,我們可以通過指針變量指向這個地址來訪問地址里面的數,只要把指針變量定義成同數據類型就可以指向了,比如說要指向字符型變量就定義字符型指針變量,所以我們也可以定義結構體類型指針來指向它。
- 1、直接用
struct
聲明一個結構體,然后在定義結構體指針,struct 結構體名稱 *結構體指針變量名 - 2、用
typedef struct
聲明一個結構體,并且為結構體重命名,通過別名的方式定義結構體指針。結構體別名 *結構體指針變量名
結構體指針訪問成員方法 結構體指針變量名->成員名
五、包含結構體的結構體
學生信息包含姓名,學號,性別,出入日期等數據,而出生日期又包含年月日這3個成員,所以把出生日期單獨聲明一個結構體,那么學生這個結構體就包含出生日期這個結構體,這種就是包含結構體的結構體。
六、鏈表
在數據結構里面,有一種數據結構叫做鏈表,鏈表通俗的說就是把多個結構體變量像鐵鏈一樣環環相扣連接起來,我們拿4個學生數據組成的鏈表來舉例,分析鏈表具體的工作原理。
#include/*只要具備多種屬性就可以用結構體來構造;比如串口具有多種信息,時鐘源,波特率,停止位,校驗位*/ typedef struct{ ?? ?unsigned short Year; ?? ?unsigned char Mon; ?? ?unsigned char Day; }today;/*這個結構體只是構造一下,本程序沒有用到*/ struct student{ ?? ?unsigned char Name[20]; ?? ?unsigned char number; ?? ?unsigned char sex; ?? ?student *pLast; /*雙向鏈表*/? ?? ?student *pNext; }; int main() { ?? ?unsigned char i; ?? ?struct student *pStu; ? ?? ?struct student stu1[4] = ?? ?{ ?? ??? ?{"stu1",1,'m',0,0}, ?? ??? ?{"stu2",2,'m',0,0}, ?? ? ?? ?{"stu3",3,'m',0,0}, ??? ? ?? ?{"stu4",4,'m',0,0},?? ? ? ?? ?}; ?? ?stu1[0].pNext = &stu1[1]; ?? ?stu1[1].pNext = &stu1[2]; ?? ?stu1[2].pNext = &stu1[3];?? ? ?? ?stu1[3].pLast = &stu1[2]; ?? ?stu1[2].pLast = &stu1[1]; ?? ?stu1[1].pLast = &stu1[0]; ?? ?pStu = &stu1[0]; ?? ??? ? ?? ?for(i=0;i<4;i++) ?? ?{ ?? ?printf("name=%s,number=%d,sex=%c\r\n",pStu->Name,pStu->number,pStu->sex); ?? ?pStu = pStu->pNext;?? ??? ? ?? ?} ?? ?pStu = &stu1[3]; ?? ?printf("\r\n");?? ? ?? ?for(i=0;i<4;i++) ?? ?{ ?? ?printf("name=%s,number=%d,sex=%c\r\n",pStu->Name,pStu->number,pStu->sex); ?? ?pStu = pStu->pLast;?? ??? ? ?? ?}?? ??? ? ?? ??? ? ?? ?return 0; }
鏈表是基于結構體的一種線性的數據結構。
結構體的應用非常廣泛,這里我們記住一個黃金法則:只要是具備多種屬性的任何東西,都可以用結構體來構造,我們把這個東西叫做對象。比如說單片機的串口是不是有時鐘源、波特率、停止位、校驗位這些屬性?那么串口就是一個對象,可以用結構體來構造。
七、靜態鏈表
上面的鏈表是4個學生信息的結構體變量連接在一起,這種是靜態的鏈表,意思就是連接在一起的結構體變量數量是固定的,靜態創建鏈表的方法適用于一些固定好數量的數據結構。比如產品需要在LCD上面顯示多級菜單架構,一般使用按鍵或者觸摸去進入子菜單或者返回主菜單,那么就可以把這些主菜單和子菜單做成一個鏈表,那么配合結構體指針就可以很輕松的找到需要跳轉的菜單了,像這種菜單結構往往在功能定義的時候就要規劃清楚一共需要多少個菜單,每一個菜單有那些共同的屬性。
八、動態鏈表
動態鏈表的意思就是通過動態分配的方式把結構體變量連接起來,這種結構體變量的數量是未知的,會隨著某種條件增加或減少結構體變量的數量。比如說我要接收串口的數據,如果串口一次性接收10個數據那么很好處理,我們直接定義一個數組,把大小設置成10就可以了。那如果我們不知道到底串口會來多少個數據的情況下,比如說有可能這一幀來100個,下一幀來1000個,那用數組來存儲是不是就很不方便,不知道到底該分配多大的數組,如果分配大小為1000的數組就會造成內存浪費,像我們就可以使用動態鏈表的方式來實現。
一般動態鏈表用在底層操作系統比較多,通常用來做消息隊列或者是任務創建。
原文鏈接:https://blog.csdn.net/weixin_44795447/article/details/123186546
相關推薦
- 2022-04-03 用Python實現屏幕截圖詳解_python
- 2023-02-26 C++?ROS與boost:bind()使用詳解_C 語言
- 2024-04-02 linux網絡查看配置與docker網絡刪除
- 2022-04-09 Spring事務管理之開啟聲明式事務
- 2024-01-12 間隙鎖(Gap Lock)
- 2024-01-28 spring ioc容器
- 2022-07-10 如何替換重構依賴里面的Service
- 2022-09-22 string類的模擬實現
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支