結構體宣告
struct tag //結構體名稱可以省略,但建議不要省略
s,*p/*可以在宣告的同時定義變數*/;
舉個例子
struct
x;struct
*p,s;
注意:這裡是匿名結構體,編譯器把二者看作完全不同的型別
結構體訪問
結構體訪問操作符:點操作符(.)、(->)操作符。
struct stu
*p,s;
/*成員訪問*/
s.name = "李四";
s.age = 20
;/*指標訪問*/
(*p).name = "張三";
(*p).age = 18
;
結構體自引用
結構體自引用要通過指標引用。
/*正確引用*/
struct s
/*錯誤引用*/
struct s
結構體內存對齊
先了解乙個概念:對齊數
對齊數 = 編譯器預設的對齊數於該成員中的最小值。vs 預設值 4,linux 預設值 為8.
記憶體對齊的4個原則:
第乙個成員在結構體偏移量為0的位址處
其他成員要對齊到偏移量為對齊數整數倍的位址處。
結構體的大小為最大對齊數的整數倍。
巢狀的結構體要對齊到結構體最大對齊數的整數倍。
可以通過#pragma pack(num) 更改預設對齊數(num = 1,2,4,8,16任意乙個),當更改的大於編譯器預設的時候,預設對齊數不改變。
結構體實現位段
舉個例子
/*位段*/
struct a
位段成員必須是 int 、unsigned int 、signed int 、char.
位段分配記憶體空間如下:
位段空間開闢:是以4個位元組(int)、1個位元組(char)開闢的。
位段的跨平台問題:
成員在記憶體中從左往右分配、還是從右往左分配標準未定義。
第二個位段成員,無法容納上乙個位段剩餘的位置時,是捨棄剩餘位還是利用,是不確定的。
位段記憶體對齊:
結構體位段,資料成員型別相同,第乙個成員已對齊,所以其餘也對齊了。
結構體 詳解
1 c語言基本型別 字元型,整型,浮點型 2 結構體 複雜型別 自定義型別 i 3 定義變數 為了分配空間 型別 變數名 注 分配空間編譯器通過型別來分配 初始化 定義變數同時賦值 3.1定義結構體 自定義 的型別 struct 型別名 3.1.1無巢狀結構體 所有屬性都是基本型別 定義人的型別 人...
結構體對齊詳解
include struct a int main struct b 現在已知32位機器上各種資料型別的長度如下 char 1 有符號無符號同 short 2 有符號無符號同 int 4 有符號無符號同 long 4 有符號無符號同 float 4 double 8 那麼上面兩個結構大小如何呢?結果...
Linux Struct file 結構體詳解
二 struct path f path 被定義在linux include linux namei.h中,其原型為 struct path 在早些版本的核心中並沒有此結構,而是直接將path的兩個資料成員作為struct file的資料成員,struct vfsmount mnt的作用是指出該檔案...