C 結構體學習總結

2021-09-01 12:44:45 字數 1238 閱讀 5946

我們在某些場景下,需要用不同的變數來描述同乙個東西,此時用單一的char,int…等型別來修飾變數是不夠的,於是我們便需要結構體的存在。什麼是結構體呢?乙個結構體是許多值的集合,這些值就是結構體的成員變數,而這些變數可以是不同的型別。

0.結構體的定義

例如我們現在要描述乙個學生:

struct student stu1;
我們可以看到結構體分為兩部分,一是定義變數,一是成員變數。

1.結構體的初始化

現在我們初始化上述例子:

struct student stu = ;
當然除此之外,我們也可以在定義結構體時直接初始化乙個變數。

2.結構體的記憶體對齊

我們先來看兩個例子:

struct s1 ; 

printf("%d\n", sizeof(struct s1));

struct s2 ;

printf("%d\n", sizeof(struct s2))

輸出結果是12,8,那麼這個結果是怎麼來的呢?我們先來熟悉一下c語言對於結構體內存對齊的規則:

第乙個成員在與結構體變數偏移量為0的位址處。

其他成員變數要對齊到某個數字(對齊數)的整數倍的位址處。 對齊數 = 編譯器預設的乙個對齊數 與 該成員大小的較小值。 vs中預設的值為8 linux中的預設值為4。

結構體總大小為最大對齊數(每個成員變數都有乙個對齊數)的整數倍。

如果巢狀了結構體的情況,巢狀的結構體對齊到自己的最大對齊數的整數倍處,結構體的整體大小就是 所有最大對齊數(含巢狀結構體的對齊數)的整數倍。

如此冗長的定義我們是很難理解的,但事實上也很容易解釋清楚的我們以第乙個為例char c1存放在偏移量為0的位置且占用乙個位元組,int i 大小為4個位元組,vs預設的對齊數為8,所以較小值是4,同理char c2的對齊數為1,可以看出所有成員中i的對齊數最大,所以結構體整體大小為4的整數倍12.

事實上這個預設記憶體對齊大小其實可以用#pragma這個預處理指令進行調整的。

#pragma pack(4) //設定預設對齊數為4

#pragma pack() //取消設定的預設對齊數,並恢復預設值

那麼結構體內存的意義是什麼呢?其實是拿空間換取時間,所以上述兩個例子中,雖然結構體成員變數一模一樣,但是所佔記憶體卻不同。

C 學習 結構體

結構體定義的格式如下 struct 結構體型別名 例如,我用乙個結構體儲存學生的資訊 struct studentt 欄位名可以和程式中的變數名相同,不同結構體內的欄位名也可以相同。結構體的成員型別可以是任意型別,可以是整型,浮點型,陣列,也可以是其他的結構體型別 不能是自己,但可以是指向自己這一結...

c 結構體轉為string c 結構體學習

宣告及使用 include int main struct user printf user size is lu sizeof struct user user size is 8 struct stu jack printf jack size is lu sizeof jack jack si...

C 結構體的學習

結構體是自定義型別的一種,是cpp提供擴充套件自定義型別的一種方式。結構體的宣告方式有2種 第一種是 struct user type variables variables可有可無第二種是 type struct user type include include include using na...