結構體spa
1,結構體即爲多個基本數據類型組合而成的數據類型。結構體本質上同int等同樣同爲數據類型,能夠定義變量,內部成員不能直接賦值。code
struct Man { int age = 30; int score = 80; };
上面是錯誤的。正確寫法以下:blog
struct Man { int age; //這樣就行了 int score; }; int main() { struct Man man1 = {30,80}; }
2,結構體常同typedef類型重命名一同使用,以下:內存
typedef struct Man { int age; //這樣就行了 int score; }MAN; int main() { MAN man1 = {30,80}; }
3,結構體內存對齊io
typedef struct Man { char age; //這樣就行了 int score; }MAN; int main() { printf("%d",sizeof(MAN)); }
以上代碼輸出的值爲8,而不是直觀意義上的5,這是由於結構體中的成員是對齊的,這裏按4字節對齊。當CPU訪問正確對齊的數據時,它的運行效率最高,數據對齊不是內存結構的一部分,而是CPU結構的一部分。class
結構體成員對齊是按照類型大小對齊的,而結構體按照長度最大的類型對齊。如成員中char按1字節對齊,short按2字節對齊,int按照4字節對齊等,這裏的結構體成員最長的是int爲4字節,因此這個結構體按照4字節對齊。效率
聯合體變量
1,聯合體本質上爲不一樣數據類型共享存儲空間,此空間要大到足夠容納最"寬"的成員。它的全部成員相對於基地址的偏移量都爲0。數據類型
union U { char s[9]; int n; double d; };
2,聯合體一般與結構體共用,經過不一樣方式給變量賦值。nio
union REG { struct { unsigned short a; unsigned short b; } H;
unsigned int R;
} Reg;
上面能夠經過Reg.R給變量賦值,也能夠分別經過Reg.H.a、Reg.H.b分別賦值,要注意字節序。