簡單解析C語言結構體

2021-08-03 15:30:43 字數 1541 閱讀 7078

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...