C語言學習:C語言關鍵字(三)

正文共:

22901 圖。預計閱讀時間: 6 分鐘

主要內容:C語言關鍵字struct和typedf詳解.

什麼是關鍵字

關鍵字是系統定義的,具有特定含義、專門用於特定用途的C語言標識符,也稱為保留字。關鍵字一般為小寫字母,在使用時必須遵守一定的語法規則,如果隨意使用關鍵字,可能會出現意想不到的錯誤,有時程序雖然編譯通過,但結果運行不正確,並且很難檢查出來。標準C語言共有32個關鍵字。

昨天我們講了兩個C語言關鍵字register和static。不明白的可以查看我的前一篇文章,但是有點水分。今天的也講兩個大家比較熟悉的關鍵字。typedf和struct。先說struct,struct是是屬於數據類型。它的含義是結構體型。而typedf是屬於存儲類型。它的含義是用戶自定義類型命名。

C語言學習:C語言關鍵字(三)

typedf-用戶自定義類型命名

typedef 關鍵字是個偉大的縫紉師,擅長做馬甲,任何東西穿上這個馬甲就立馬變樣。它可以把狼變成一頭羊,也能把羊變成一頭狼。甚至還可以把長著翅膀的鳥人變成天使,同樣也能把美麗的天使變成鳥人。

歷史的誤會——也許應該是typerename。

很多人認為typedef 是定義新的數據類型,這可能與這個關鍵字有關。本來嘛,type 是數據類型的意思;def(ine)是定義的意思,合起來就是定義數據類型啦。不過很遺憾,這種理解是不正確的。也許這個關鍵字該被替換為“typerename”或是別的詞。typedef 的真正意思是給一個已經存在的數據類型(注意:是類型不是變量)取一個別名,而非定義一個新的數據類型。比如:華美絕倫的芍藥,就有個別名---“將離”。中國古代男女交往,往往以芍藥相贈,表達惜別之情,送芍藥就意味著即將分離。所以文人墨客就給芍藥取了個意味深長的別名-----“將離”。這個新的名字就表達了那種依依不捨的惜別之情…這樣新的名字與原來的名字相比,就更能表達出想要表達的意思。


在實際項目中,為了方便,可能很多數據類型(尤其是結構體之類的自定義數據類型)需要我們重新取一個適用實際情況的別名。這時候typedef 就可以幫助我們。舉個例子:就像某某給你取了個小名,這個小名更能代表你的印象,我們就這樣約定俗成的習慣了,這就是typedf,簡單記住就是取小名,好吧!讓別人跟容易記住你。

struct-詳解請做好筆記

C語言提供了一種自定義數據類型的機制,利用這種機制可定義出比較複雜的數據類型,如數組、結構體等。這些複雜數據的成員仍然數基本數據類型(整型、字符型、實型、枚舉型),所以結構體類型又稱為構造數據類型。與數組不同的是,數組中的元素都是相同數據類型的,而結構體類型中的元素可以是不同類型的。可能到現在你還是懵的,舉個例子:用結構體來描述一個學生的信息如下:

struct student

{

char name[10];

int age;

long phone;

};

說明:這是一個學生的結構體,結構體名字為student;有三個成員或者元素。分別為name、age、phone。而且都是不同的數據類型,這就是struct的強大之處。可以分裝不同的數據類型。其中以分號‘’;‘’作為結束符。

struct 是個神奇的關鍵字,它將一些相關聯的數據打包成一個整體,方便使用。在網絡協議、通信控制、嵌入式系統、驅動開發等地方,我們經常要傳送的不是簡單的字節流(char 型數組),而是多種數據組合起來的一個整體,其表現形式是一個結構體。經驗不足的開發人員往往將所有需要傳送的內容依順序保存在char 型數組中,通過指針偏移的方法傳送網絡報文等信息。這樣做編程複雜,易出錯,而且一旦控制方式及通信協議有所變化,程序就要進行非常細緻的修改,非常容易出錯。這個時候只需要一個結構體就能搞定。平時我們要求函數的參數儘量不多於4 個,如果函數的參數多於4 個使用起來非常容易出錯(包括每個參數的意義和順序都容易弄錯),效率也會降低。這個時候,可以用結構體壓縮參數個數。

空結構體多大?

結構體所佔的內存大小是其成員所佔內存之和。這點很容易理解,但是下面的這種情況呢?
struct student
{
}stu;
sizeof(stu)的值是多少呢?
很遺憾,不是0,而是1。為什麼呢?你想想,如果我們把struct student 看成一個模子的話,你能造出一個沒有任何容積的模子嗎?
顯然不行。編譯器也是如此認為。編譯器認為任何一種數據類型都有其大小,用它來定義一個變量能夠分配確定大小的空間。既然如此,編譯器就理所當然的認為任何一個結構體都是有大小的,哪怕這個結構體為空。那萬一結構體真的為空,它的大小為什麼值比較合適呢?

假設結構體內只有一個char 型的數據成員,那其大小為1byte(這裡先不考慮內存對齊的情況).也就是說非空結構體類型數據最少需要佔一個字節的空間,而空結構體類型數據總不能比最小的非空結構體類型數據所佔的空間大吧。這就麻煩了,空結構體的大小既不能為0,也不能大於1,怎麼辦?定義為0.5個byte?但是內存地址的最小單位是1 個byte,0.5 個byte 怎麼處理?解決這個問題的最好辦法就是折中,編譯器理所當然的認為你構造一個結構體數據類型是用來打包一些數據成員的,而最小的數據成員需要1 個byte,編譯器為每個結構體類型數據至少預留1 個byte的空間。所以,空結構體的大小就定位1 個byte。


總結

今天的內容還是我們經常遇見的,我認為這樣的講解方式還是比較通俗的,如果還是不懂得可以問,明天繼續。

關注我們:源世界Z

源世界為您奉上精品文章。


分享到:


相關文章: