C語言結(jié)構(gòu)體詳細(xì)圖解分析
結(jié)構(gòu)體
結(jié)構(gòu)是一些值的集合,這些值稱為成員變量。結(jié)構(gòu)的每個成員是不同類型的變量。
為什么要有結(jié)構(gòu)體
比如說,描述一個學(xué)生時,需要有
- 名字
- 性別
- 年齡
- 身高
來一起描述,需要不同的變量,便有了結(jié)構(gòu)體類型來描述
結(jié)構(gòu)體的聲明
struct tag { member-lest//成員列表 }variable-list;//變量列表
例如一個學(xué)生
struct stu { char name[20]; char sex[5]; int age; int hight; };//這里有沒有變量列表都可以
struct stu { char name[20]; char sex[5]; int age; int hight; }s2,s3,s4;//s2,s3,s4全局變量 struct stu s5; int main() { struct stu s1;//結(jié)構(gòu)體變量 }
特殊聲明
在聲明結(jié)構(gòu)體時候,可以不完全聲明
struct { char c; int a; double a; }sa;//匿名結(jié)構(gòu)體變量,必須在此處定義變量,否則以后不能使用 int main() { return 0; }
編譯器認(rèn)為ps和&sa是兩種類型,這種寫法是錯誤的
數(shù)據(jù)結(jié)構(gòu):數(shù)據(jù)在內(nèi)存中存儲的結(jié)構(gòu)
關(guān)于列表
struct node { int date; struct node next; }; int main() { return 0; }
這樣無法判斷結(jié)構(gòu)體大小 只需在結(jié)構(gòu)體存放能找到下一個結(jié)構(gòu)體內(nèi)容的指針即可
struct node { int date; struct node* next; }; int main() { return 0; }
也可以這樣(重命名使用舉例)
typedef struct node { int date; struct node* next; }node; int main() { struct node n2 = { 0 };//2者都可以使用 node n = { 0 };//盡量不對結(jié)構(gòu)體使用typedef }
結(jié)構(gòu)體變量的定義和初始化
struct point { int x; int y; }p1; //聲明類型同時定義變量p1 struct point p2;//定義結(jié)構(gòu)體變量p2 //初始化:定義變量的同時賦初值 struct point p3 = { 1,2 }; struct stu //類型聲明 { char name[15];//名字 int age; //年齡 }; struct stu s = { "zhangsan",20 };//初始化 struct node { int date; struct point p; struct node* next; }n1 = { 10,{4,5},NULL }; //結(jié)構(gòu)體嵌套初始化 struct node n2 = { 20,{5,6},NULL };//結(jié)構(gòu)體嵌套初始化
結(jié)構(gòu)體大小計算
先來觀察下列代碼
#include <stdio.h> int main() { struct S1 { char c1; int i; char c2; }; printf("%d\n", sizeof(struct S1)); //練習(xí)2 struct S2 { char c1; char c2; int i; }; printf("%d\n", sizeof(struct S2)); //練習(xí)3 struct S3 { double d; char c; int i; }; printf("%d\n", sizeof(struct S3)); //練習(xí)4-結(jié)構(gòu)體嵌套問題 struct S4 { char c1; struct S3 s3; double d; }; printf("%d\n", sizeof(struct S4)); return 0; }
發(fā)現(xiàn)并不是數(shù)據(jù)類型大小的簡單相加
存在對齊
如何計算?
首先得掌握結(jié)構(gòu)體的對齊規(guī)則:
1. 第一個成員在與結(jié)構(gòu)體變量偏移量為0的地址處。
2. 其他成員變量要對齊到某個數(shù)字(對齊數(shù))的整數(shù)倍的地址處。
對齊數(shù) = 編譯器默認(rèn)的一個對齊數(shù) 與 該成員大小的較小值。
VS中默認(rèn)的值為8
3. 結(jié)構(gòu)體總大小為最大對齊數(shù)(每個成員變量都有一個對齊數(shù))的整數(shù)倍。
4. 如果嵌套了結(jié)構(gòu)體的情況,嵌套的結(jié)構(gòu)體對齊到自己的最大對齊數(shù)的整數(shù)倍處,結(jié)構(gòu)體的整
體大小就是所有最大對齊數(shù)(含嵌套結(jié)構(gòu)體的對齊數(shù))的整數(shù)倍。
為什么存在內(nèi)存對齊 ?
大部分的參考資料都是如是說的:
1. 平臺原因(移植原因):
不是所有的硬件平臺都能訪問任意地址上的任意數(shù)據(jù)的;某些硬件平臺只能在某些地址處取某些特
定類型的數(shù)據(jù),否則拋出硬件異常。
到此這篇關(guān)于C語言結(jié)構(gòu)體詳細(xì)圖解分析的文章就介紹到這了,更多相關(guān)C語言 結(jié)構(gòu)體內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
編寫C語言程序進(jìn)行進(jìn)制轉(zhuǎn)換的問題實例
這篇文章主要介紹了編寫C語言程序進(jìn)行進(jìn)制轉(zhuǎn)換的問題實例,文中附錄了一個各種進(jìn)制間的轉(zhuǎn)換程序代碼,需要的朋友可以參考下2015-08-08c/c++拷貝構(gòu)造函數(shù)和關(guān)鍵字explicit詳解
這篇文章主要介紹了c/c++拷貝構(gòu)造函數(shù)和關(guān)鍵字explicit的相關(guān)知識,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下2018-08-08