天天看點

c語言int 轉bool_C語言基礎,結構體的使用和你真用過結構體嗎

大家好,感謝閱讀,我們前幾期說了數組指針等C語言比較重要的知識點,這次就來講一下C語言中的結構體和枚舉等。

c語言int 轉bool_C語言基礎,結構體的使用和你真用過結構體嗎

結構體

我們都是知道,一個數組,它隻能儲存相同類型的一組資料,但是在生活中,這明顯是不行的,因為在軟體中有個進階詞彙叫做抽象,當我們對一個真實存在的事物進行抽象時,那麼我們會将這個事物的特征等作為對象的屬性,是以當一個集合隻能儲存一個資料類型的時候,明顯不能完整的儲存資料,例如:我們需要儲存一個人的資訊,這個人有年齡、姓名、生日等,這其中需要的資料類型就有int ,string等類型,怎麼辦呢,我們這時就需要字典,咳咳!說錯了,我們需要一個結構體。

結構體的定時方式就是:

struct name{char * name;int age;}
           

非常簡單吧,既然我們常說的數組是一種資料類型,那麼和它相似的結構體是不是也是一種類型呢,答案是明确的,當我們定義好一個結構體時,我們可以看 (struct name ) 作為資料類型的名字 相當于 int等。然後我們就可以用它定義一個變量了。但是需要注意一點的是,不要以為我們用了struct就是聲明了一片記憶體空間,使用struct隻是告訴電腦,我的結構體名字是name,它裡面有兩個類型不同的資料,簡單的來說就是模具,然後我們用模具倒出很多個真實存在的物品,是以說struct聲明的結構體就是這樣,它隻是徒有其表,計算機并沒有給它配置設定記憶體空間,隻有當使用它定義一個變量時,系統才會配置設定記憶體空間給它。這裡要注意的是結構體的記憶體也是連續的。

c語言int 轉bool_C語言基礎,結構體的使用和你真用過結構體嗎

記憶體儲存也是連續的

我們知道在資料類型後面加方括号并聲明數量是進行定義數組的,它也是可以用來聲明一個數組,和正常的數組聲明方式是一緻的,從這些方面來看,當我們定義一個結構體後,這個結構體就成為了一種資料類型,我們可用是它聲明數組,指針,指針變量等等。是以正确記憶結構體的方式就是我們将它作為一個可以儲存自定義資料的一個數組類型即可。

除了結構體外,在C語言中還有枚舉和共同體,就我個人看來,枚舉就是儲存了大量混定義的數組。共同體不一樣,它和結構體得到差別,在記憶體配置設定上。如上圖所示,結構體變量聲明後它每一個記憶體區域都會連續配置設定好,也就是說記憶體的大小是結構體内所有元素的和。而共同體占用的記憶體空間隻是元素最長的長度。是以我們在給其中一個元素指派後,如果再給另一個元素指派,那麼以前的那個元素的值就會被覆寫掉,當然,它的局限性也限制了它使用範圍,是以我們在程式設計中很少用到,但是到了記憶體較小的單片機等裝置中,共同體占用記憶體小的特點,讓它在這一個領域如魚得水。

說到記憶體占用,我突然記起來,實際在應用過程中,我們經常要對軟體做優化,而我們在C語言中,如果需要對程式做優化,那麼我們可以在結構體中用到一個概念,那就是位域。

c語言int 轉bool_C語言基礎,結構體的使用和你真用過結構體嗎

位域

我們可以看到使用unsigned來定義變量,在“:”後面我們加了一個數字,這就是我們所說的位域了,位域的作用就是我們在編寫代碼過程中,結構體中成員太多,是以占用的記憶體太多,是以我們可以根據實際情況,将系統自動比對的記憶體大小減少為實際資料最大記憶體的大小,簡單的說,我們去吃買西瓜,以前不切的時候,我們就必須買一個,但是又吃不完,現在好了,我們有了位域,再買西瓜的時候,我們想買多少就賣多少,夠自己吃就好了。和西瓜一樣,我們不能平白無故的給一個已經長成的西瓜在增添一塊,位域也是同樣道理,我們設定的位域不能超過資料類型的最大長度,否則就會出現記憶體溢出。當然并不是所有資料類型都可以設定位域的,int、signed int 和 unsigned int等有限的幾種類型可以設定位域,C99中增加了_Bool型。

結語:我們通過幾期的學習,已經将C語言的相關知識點,記憶體管理,堆和棧,指針等已經将解完成,但是C語言的學習之路還有很長,是以我們自己私下需要多學多動手,隻看不練,最終隻能停留在了解的層次,無法真正的體驗代碼的樂趣,最後感謝閱讀。做個小調查,我們後面的學習中,最想學的是什麼。

原創首發于頭條号,作者:小黃雞軟體

繼續閱讀