日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

关于C语言之结构体(struct)介绍

發布時間:2023/12/8 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 关于C语言之结构体(struct)介绍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

轉自:微點閱讀??https://www.weidianyuedu.com

導讀:

結構體,怎么理解?

你可以把它想象成一個桌面上的文件夾,這個文件夾里面可以有各種各樣的文件,當然也還可以再有文件夾的存在,文件夾里面再放文件……。如果你要修改其中一個文件的內容,就是首先通過桌面上的那個文件夾作為入口,然后一個一個的進入文件夾去尋找你需要的文件,找到之后就可以隨你修改了。

long、unsigned int 、short、char(相當于各種文件類型,比如 .txt、.c、.h)這些關鍵字是否很熟悉?這都是 C 語言定義好的數據類型,直接拿來用就行了。但是我想自定義一個別的類型的數據怎么辦?

就靠?struct?了。結構體,顧名思義,就是將一個個數據類型構成一個數據類型以方便使用。

比如說一個 24 位的像素,有 R、G、B 三種顏色,每種顏色都用 8 bit 表示,如果使用一般的方法怎么表示呢?看圖:

這樣表示當然沒有問題,也能解決你的需求,但是你在使用的時候會發現,通常他們使用場合一樣,只是有的時候需要使用 Red 值,有的時候需要 Green,有的時候可能又要 Blue,但它們的共同點是都是用來表示一個像素的,那么有沒有辦法把這些數據類型組合起來方便調用呢?當然有,就是今天的主角,struct。

我們先看看使用 struct 如何表示一個像素:

Pixel 中文表示像素,這樣就通過這個結構體將三個數據結合在一起了(用文件夾裝在一起),并且這個新組合的數據類型就叫 Pixel,和 int、char 等類似。

那么我們如何像使用 int、char 一樣定義一個代表像素的數據類型呢?

就是通過 struct + 結構體名 定義了。

這里定義了兩個像素,每個像素下都有 Red、Green、Blue 這三個字節數據,也就是說共有六個字節的空間:

那么對于這些數據如何使用呢?比如說要設置 Red=100,Green=120,Blue=210:

這樣就行了,是不是很簡單呢!如果你的 MDK 開啟了輸入補充功能,那么寫這些代碼就更容易了:

可以看到你在敲完 Pixel1. 的圓點后,結構體的成員立馬出來了,這時候你就能自己選擇哪一個成員了,是不是很方便呢。不然一個結構體那么多成員,怎么記得住啊。

如果你用這個結構體數據類型定義了一個結構體指針,那么就通過 -> 箭頭調用,相當方便的。

而且如果你想對整個結構體進行賦值也是很方便的事情:

這樣一條語句就將三個成員變量的值進行了修改,和通過關鍵字定義的變量并沒什么區別。

但還有一點,每次定義一個結構體變量都要敲 struct 關鍵字還是很麻煩的事情,所以這個時候可以使用 typedef 這個關鍵字了:

這樣聲明之后,每次要定義一個新的 Pixel 結構體,只要使用 Pixel 就行了,而不必加入 struct 來聲明這是一個結構體。而為了讓自己知道這是一個自己定義的數據類型,一般會在名稱后面加 _t 或者 TypeDef 等。比如 GPIO 結構體:

并且結構體(文件夾)里面還可以套結構體(文件夾),被套的結構體里面也可能有結構體……。不僅能套結構體,指針、聯合體、枚舉、數組(各種文件)也都是一樣的,而常規的 char、int 等更不用說了,完全按你的心意隨意組合就是了(比如上面的結構體套了 uint16_t 和 兩個結構體)。

這些數據類型都可以通過結構體形成一個數據結構類型,是不是感覺特別方便啊。小項目可能結構體用的不多,但是大項目如果不用結構體,那么操作數據類型是一件很麻煩的事情,所以一定要學會使用結構體。

當然了,套用的結構體多了,對運行效率還是有一些影響的,對一些性能要求比較高的地方可以不用結構體,或者通過一些方法提高效率,不然你套的深了,尋找其中的成員變量還是需要不少指令消耗的,這一點需要引起注意。另外,編譯器為了優化讀寫效率,可能會對數據類型進行填充:

這個存儲空間應該是 1+1+1+4 = 7,但是實際上是 8 (你可以通過 sizeof() ?測試),就是因為 STM32 的處理字長為 4 個字節,是最快的讀寫長度,所以對變量 Reserve 進行了 4 字節對齊。它的存放位置如下:

當然這個是可以通過對齊方式進行修改的,但最好不要,因為這樣會降低讀寫效率,除非是那種定義好的通信協議,那沒辦法,只能改了(這個坑千萬要注意)。

有的時候可能需要獲取結構體的偏移地址,此時就可用通過以下方法獲取:

結構體偏移量計算宏(非常規方法):

#define OFFSET(TYPE, MEMBER) ? ((unsigned long)(&(((TYPE *)0)->MEMBER)))

比如說要獲取 Green 在結構體 Pixel 的偏移地址,就可以通過上面的宏進行計算:

Offset 的結果就是 1,因為前一個 Red 共占用了一個字節空間,所以它的偏移地址就是 1。

最后再看看結構體的初始化,就是對成員變量順序初始化:

struct xxxx ?xxx = {xxxxx, xxxxx, xxxxx};

而在 C99 模式下可以使用以下方式對結構體進行初始化,這樣就能方便的觀察每一個變量的初始值:

struct xxxx ?xxx = {.x1 = xxxxx,.x2 = xxxxx,.x3 = xxxxx};

總結

以上是生活随笔為你收集整理的关于C语言之结构体(struct)介绍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。