自定义类型: 结构体,枚举,联合
生活随笔
收集整理的這篇文章主要介紹了
自定义类型: 结构体,枚举,联合
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
???1.結(jié)構(gòu)體
???個人認為結(jié)構(gòu)體和數(shù)組特別相似,只不過結(jié)構(gòu)體和數(shù)組的區(qū)別在于結(jié)構(gòu)體的成員可以是不同類型,而數(shù)組成員類型是相同的。
???(1)結(jié)構(gòu)體的聲明
struct tag {成員列表//至少得有一個成員 }值列表;//值列表可以省略 struct {int a;char b;float c; }x;//匿名結(jié)構(gòu)體struct {int a;char b;float c; }a[5],*p;//匿名結(jié)構(gòu)體 //注意上述的兩個匿名結(jié)構(gòu)體雖然成員列表看似相同,但編譯器在進行編譯的時候絕不會將這兩個結(jié)構(gòu)體看成是一樣的結(jié)構(gòu)體,所以對于*p = &x,這種看法是絕對錯誤的???(2)結(jié)構(gòu)體成員
?????結(jié)構(gòu)體成員可以是int,float,double,char等基本類型,也可以是數(shù)組,指針,甚至結(jié)構(gòu)體,枚舉等都可以。結(jié)構(gòu)體成員在訪問的時候采用結(jié)構(gòu)結(jié)構(gòu)體.成員名的方式來訪問如:
#include<stdio.h> struct Student {char name[20];int age;int grade; };//學(xué)生類結(jié)構(gòu)體 int main() {struct Student student;.//定義一個學(xué)生結(jié)構(gòu)體printf("%s\n", student.name);printf("%d\n", student.age);printf("%d\n", student.grade);return 0; }???由上可以看出,結(jié)構(gòu)體的定義通過struct 結(jié)構(gòu)體名來定義一個變量,但需要注意,單獨的聲明一個結(jié)構(gòu)體類型,系統(tǒng)不為之開辟空間。
???舉個例子
struct Student {char name[20];int age;int grade; };//系統(tǒng)不為它開辟內(nèi)存空間 struct Student student;//系統(tǒng)為之開辟內(nèi)存空間???(3)結(jié)構(gòu)體成員的訪問
????結(jié)構(gòu)體成員的訪問采用.的方式訪問,當(dāng)有結(jié)構(gòu)體指針的時候必須先對其解引用或者是結(jié)構(gòu)體指針名 -> 成員名才可對其成員訪問。
????舉個例子
#include<stdio.h>struct Student {char name[20];int age;int grade; };//學(xué)生類結(jié)構(gòu)體 int main() {struct Student student;.//定義一個學(xué)生結(jié)構(gòu)體stuct Student* student1;printf("%s\n", student.name);printf("%d\n", student.age);printf("%d\n", student.grade);printf("%d\n", (*student1).grade);//解引用的方式printf("%d\n", student1 -> age);//箭頭的方式return 0; }???(4)結(jié)構(gòu)體的自引用
//方案一 struct Student {char name[20];char sex[5];int age;struct Student* student; };//方案二 typedef struct Student {char name[20];char sex[5];int age;struct Student* Next; }Student;//typedef定義一個新類型Student,以后在定義變量的時候可以直接用Student去定義一個結(jié)構(gòu)體變量,而不用再用struct Student???(5)結(jié)構(gòu)體的初始化
struct Student {char name[20];char sex[5];int age;int grade; }; //方案一整體賦值 struct Student student = {"張三", "男", 20, 90};//方案二逐個賦值 struct Student student1; strcpy(student1.name, "李四"); strcpy(student1.sex, "男"); student1,age = 20; student1.grade = 89;???(6)結(jié)構(gòu)體的內(nèi)存對齊
???結(jié)構(gòu)體大小的計算
????幾條規(guī)則
????????1.結(jié)構(gòu)體的第一個成員始終對齊于偏移量為0的地址(offsetof(結(jié)構(gòu)體名, 成員名))處
????????2.后面的結(jié)構(gòu)體成員對齊與某個數(shù)字(對齊數(shù))的整數(shù)倍的地質(zhì)處。其中對齊數(shù)在VS上默認是8,在Linux上默認是4。其中*對齊數(shù)* = 默認對齊數(shù)和自身成員大小的較小值
????????3.結(jié)構(gòu)體的總大小為最大對齊數(shù)
????????4.結(jié)構(gòu)體如果嵌套了結(jié)構(gòu)體,嵌套的結(jié)構(gòu)體對齊到自己的最大對齊數(shù)的整數(shù)倍的地址處。
????舉個例子
//VS下 #include<stdio.h> int main() {struct S1{char c1;//1int i;//3 4char c2;//1};//12struct S2{char c1;//1char c2;//1int i;//2 4};//8struct S3{double d;//8char c;//1int i;//3 4};//16struct S4{char c1;//1struct S3 s3;//7 16double d;//8};//32printf("%d\n", sizeof(struct S1));//12printf("%d\n", sizeof(struct S2));//8printf("%d\n", sizeof(struct S3));//16printf("%d\n", sizeof(struct S4));//32return 0; }?????不同平臺對地址的訪問要求不同,不是所有的硬件平臺都可以訪問任意地址的數(shù)據(jù),有的硬件平臺規(guī)定某些平臺只能訪問某些特定的數(shù)據(jù),所以當(dāng)訪問不正確是會出現(xiàn)錯誤,而且如果沒有內(nèi)存對其,有的數(shù)據(jù)本來一次可以訪問到,但卻要兩次訪問,這樣大大降低了內(nèi)存的訪問速度,因此便有了結(jié)構(gòu)體的內(nèi)存對其。
???(7)結(jié)構(gòu)體傳參
?????結(jié)構(gòu)體在傳參時為了節(jié)省內(nèi)存,在傳參時采用地址傳參,同時要對其成員進行訪問時可以通過對其地址解引用的方式訪問其成員
???(8)結(jié)構(gòu)體的位段
?????舉個例子
struct A {int _a:2;int _b:5;int _c:10;int _d:30; };//位段類型 printf("%d\n",sizeof(struct A));//不同平臺結(jié)果不一樣????A.位段的內(nèi)存分配
?????a.位段成員只能是整型家族int,unsigned int , signed int,char
?????b.不跨平臺
?????c.按一字節(jié)或四字節(jié)方式分配
????B位段中的問題
??????a.將其當(dāng)成有符號還是無符號不確定
??????b.成員內(nèi)存從左分配還是從右分配不確定
??????c.當(dāng)包含多個位段時,前一個位段所剩余內(nèi)存應(yīng)該舍棄還是保存都不確定
??????d.位段中最大位的數(shù)目不同機器不同
???2.枚舉
???(1)枚舉定義
??????將有限個可能取值都一一列舉出來
enum Sex {MALE,FEMALE,SECRET };???(2)枚舉的優(yōu)點
??????A.增加代碼可讀性和可維護性
??????B.比起宏定義來,枚舉對類型檢查較為嚴謹
??????C.使用方便,一次可以定義多個變量
??????D.具有一定的封裝代碼作用
???3.聯(lián)合體
???(1)聯(lián)合特點
??????聯(lián)合體公用一塊內(nèi)存空間
#include<stdio.h>int main() {union Un1{char c[5];//1int i;//4};//最大是5,但5不是最大對其數(shù)的倍數(shù),所以是8union Un2{short c[7];//2 int i;//4};//最大是2 * 7 = 14, 但14不是最大對齊數(shù)4的倍數(shù),所以變成了16printf("%d\n", sizeof(union Un2));return 0; } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的自定义类型: 结构体,枚举,联合的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 整型数据存储
- 下一篇: 进入一个目录需要那些权限