1.結構體的定義
結構體是由一系列具有相同型別或不同型別的資料構成的資料集合,叫做結構。在c語言中,結構體指的是一種資料結構。
宣告乙個結構體型別的一般形式如下:
struct 結構體名
;
具體宣告如下所示:
struct struct
; //注意最後乙個有分號
注意:結構體型別的名字是又乙個關鍵字struct和結構體名組合而成的(例如struct student)。結構體名由使用者指定的。
說明:
(1)結構體型別並非一種,而是可以設計出多種,例如struct teach等,各自包含不同的成員。
(2)成員可以屬於另乙個結構體類
*定義結構體型別變數:*
(1)先宣告界結構體的型別,再定義該變數的型別
struct student(結構體型別名)
student1,student**2(結構體變數名)
(2)在宣告型別的同時定義變數
struct 結構體名
變數名表列;
(3) 不指定型別名而直接定義結構體型別變數
struct
變數名表列;
2 結構體總大小
我們在計算結構體的總大小的時候依據對齊原則。
a.對齊原則
(1)結構體的第乙個成員永遠放在0偏移處
(2)從第二個成員開始都要對齊到某個對齊數的整數倍處(對齊數為結構成員自身大小和預設對齊數的較小值。在vs平台上預設對齊數為8,在linux上預設對齊數為4)
注:預設對齊數可以被修改,利用 #pragma pack(修改後的位元組數),就可以對當前平台的對齊數進行修改。
(3)結構體的總大小必須是預設對齊數的整數倍
(4)如果鑲嵌了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是所有最大對齊數(含巢狀結構體的對齊數)的整數倍
舉例如下:
struct s
;//結構體總大小為24
分析:
由此可見對齊有點浪費空間,那麼為是麼還要對齊嘞?這就有以下兩個方面的原因了
b 對齊原因
1 平台原因(移植原因):不是所有的硬體平台都能訪問任意位址上的任意資料的,某些平台只能在某些位址處取某些特定型別的資料,否則丟擲硬體異常。
2 效能原因:資料結構(尤其是棧)應該盡可能的在自然邊界上對齊。原因在於,為了訪問未對齊的記憶體,處理器需要做兩次記憶體訪問;而對齊的記憶體訪問僅需要一次訪問。
這次就先簡單寫到這,分析介紹的比較淺,下次會繼續努力,加油。fighting !
C語言結構體 C 結構體和C 類的解析
1.c的結構體和c 結構體的區別 1.1 c的結構體內不允許有函式存在,c 允許有內部成員函式,且允許該函式是虛函式。所以c的結構體是沒有建構函式 析構函式 和this指標的。1.2 c的結構體對內部成員變數的訪問許可權只能是public,而c 允許public,protected,private三...
C語言多維陣列,結構體解析
首先講解乙個誤區 我們都知道a代表陣列的首位址,a也是陣列的位址,所以它們輸出的結果是一樣的,那麼為什麼a 1 和 a 1的結果不一樣呢?因為a代表的是陣列的首位址,也就是a 0 的位址,乙個int 型別的指標指向a 0 a代表是陣列的位址,也就是a 5 這個陣列的位址,所以這個是 int 5 型別...
C語言結構體簡單應用範例
結構體簡單應用舉例。include struct student void main void struct student tom struct student he tom 通過指標訪問結構體及其成員 我們不能像讀寫變數一樣讀寫 student 結構體 不能直接對結構體進行比較,例如 sam t...