(八)C语言之结构
今天來(lái)說(shuō)一下C語(yǔ)言里的結(jié)構(gòu)體(struct)、共用體(l聯(lián)合體)union、枚舉。
(一)結(jié)構(gòu)體:struct
1.1 概念
- 是一種自定義的數(shù)據(jù)類(lèi)型
- 結(jié)構(gòu)體是構(gòu)造類(lèi)型的一種
- 不同數(shù)據(jù)類(lèi)型的集合
- 地址空間連續(xù),每次分配最大數(shù)據(jù)類(lèi)型的寬度
- 占用內(nèi)存為所有變量的總大小(注意字節(jié)對(duì)齊問(wèn)題)
1.2 定義
1.先定義結(jié)構(gòu)體類(lèi)型,再說(shuō)明結(jié)構(gòu)體變量
struct stu {char *name; //姓名int num; //學(xué)號(hào)int age; //年齡float score; //成績(jī) }; struct stu student;上面的程序使用strcuct關(guān)鍵字定義了一個(gè)結(jié)構(gòu)體名為stu的結(jié)構(gòu)體類(lèi)型。和定義變量一樣,聲明一個(gè)結(jié)構(gòu)體類(lèi)型變量可以使用:數(shù)據(jù)類(lèi)型 變量名 的形式。
struct stu student表示定義了一個(gè)變量名為stduent,類(lèi)型為stu的結(jié)構(gòu)體。該結(jié)構(gòu)體含有4個(gè)成員:name、num、age、score
注意大括號(hào)后面的分號(hào);不能少,這是一條完整的語(yǔ)句。
2.定義結(jié)構(gòu)體類(lèi)型的同時(shí)定義結(jié)構(gòu)體變量
在定義時(shí)直接聲明結(jié)構(gòu)體變量,只需要將結(jié)構(gòu)體變量名放在花括號(hào)后面,并加上分號(hào)即可。
3.直接說(shuō)明結(jié)構(gòu)體變量
這種定義方式并不常用,這樣做書(shū)寫(xiě)雖然簡(jiǎn)單,但是因?yàn)闆](méi)有結(jié)構(gòu)體名,后面就沒(méi)法用該結(jié)構(gòu)體定義新的變量。
4.typedef重定義
這種方式比較常見(jiàn),我們使用typedef重定義結(jié)構(gòu)體為STU,這里STU就是此結(jié)構(gòu)體類(lèi)型,可以用STU去定義結(jié)構(gòu)體變量
1.3 初始化
1.在定義結(jié)構(gòu)體變量的時(shí)候全部初始化
struct stu {char *name; //姓名int num; //學(xué)號(hào)int age; //年齡float score; //成績(jī) }student={“ha”,1234,56,99};2.定義完結(jié)構(gòu)體變量后,之后只能單個(gè)賦值
struct stu {char *name; //姓名int num; //學(xué)號(hào)int age; //年齡float score; //成績(jī) }; struct stu student; student.name="ha"; student.num=1234; student.age=56; student.score=99;1.4 調(diào)用
結(jié)構(gòu)體變量.成員結(jié)構(gòu)體變量名+點(diǎn)(’.’)+成員就可以調(diào)用了
1.5 結(jié)構(gòu)體指針
當(dāng)一個(gè)指針變量指向結(jié)構(gòu)體時(shí),我們就稱(chēng)它為結(jié)構(gòu)體指針。C語(yǔ)言結(jié)構(gòu)體指針的定義形式一般為:
struct 結(jié)構(gòu)體名 *變量名; //結(jié)構(gòu)體 struct stu{char *name; //姓名int num; //學(xué)號(hào)int age; //年齡float score; //成績(jī) } stu1 = { "hah", 12, 18, 23, 136.5 }; //結(jié)構(gòu)體指針 struct stu *pstu = &stu1;注意結(jié)構(gòu)體變量名和數(shù)組名不同,數(shù)組名在表達(dá)式中會(huì)被轉(zhuǎn)換為數(shù)組指針,而結(jié)構(gòu)體變量名不會(huì),無(wú)論在任何表達(dá)式中它表示的都是整個(gè)集合本身,要想取得結(jié)構(gòu)體變量的地址,必須在前面加&,所以給 pstu 賦值只能寫(xiě)作:
1.6 獲取結(jié)構(gòu)體成員
通過(guò)結(jié)構(gòu)體指針可以獲取結(jié)構(gòu)體成員,一般形式為:
(*pointer).memberName或者:
pointer->memberName第一種寫(xiě)法中,.的優(yōu)先級(jí)高于*,(pointer)兩邊的括號(hào)不能少。如果去掉括號(hào)寫(xiě)作pointer.memberName,那么就等效于*(pointer.memberName),這樣意義就完全不對(duì)了。
第二種寫(xiě)法中,->是一個(gè)新的運(yùn)算符,習(xí)慣稱(chēng)它為“箭頭”,有了它,可以通過(guò)結(jié)構(gòu)體指針直接取得結(jié)構(gòu)體成員;這也是->在C語(yǔ)言中的唯一用途。
1.7 結(jié)構(gòu)體內(nèi)存分析
注意點(diǎn)
- 結(jié)構(gòu)體在分配內(nèi)存的時(shí)候,會(huì)做一個(gè)內(nèi)存對(duì)齊的操作
- 會(huì)先獲取所有屬性中占用內(nèi)存最大的屬性的字節(jié)數(shù)
- 然后在開(kāi)辟出最大屬性字節(jié)的內(nèi)存給第一個(gè)屬性,如果分配給第一個(gè)屬性之后還能繼續(xù)分配給第二個(gè)屬性,那么就繼續(xù)分配給第二個(gè)屬性
- 如果分配給第一個(gè)屬性之后,剩余的內(nèi)存不夠分配給第二個(gè)屬性了,那么會(huì)再次開(kāi)辟最大屬性的內(nèi)存,再次分配 依次類(lèi)推
(二)共用體(聯(lián)合體):union
2.1概念
- 所有變量共用一段空間
- 每次分配按最大長(zhǎng)度進(jìn)行分配
- 是一種構(gòu)造數(shù)據(jù)類(lèi)型
- 同一時(shí)刻只能保存一個(gè)成員的值
- 不能直接引用共用體變量名
2.2定義
它的定義和結(jié)構(gòu)體一樣,分為先定義共用體再說(shuō)明共用體變量、在定義共用體的同時(shí)說(shuō)明共用體變量、直接說(shuō)明共用體變量
union 共用體名{成員列表 };示例:
//先定義共用體再說(shuō)明共用體變量 union data{int n;char ch;double f; }; union data a, b, c;2.3 引用
和結(jié)構(gòu)體一樣,通過(guò)共用體變量名 . 成員名
union data{int n;char ch;double f; } a, b, c; a.n=3;關(guān)于共用體的詳細(xì)介紹可以看下這篇文章C語(yǔ)言共用體(C語(yǔ)言u(píng)nion用法)詳解,講到共用體這里要說(shuō)明一下大小端模式的問(wèn)題。
小端模式:低地址存放低字節(jié),高地址存放高字節(jié)
大端模式:低地址存放高字節(jié),高地址存放低字節(jié)
(三)枚舉:enum
3.1 概念
- 作用:列舉出所有的可能性,增強(qiáng)代碼的可閱讀性
- 枚舉成員都是常量
- 不能再對(duì)已經(jīng)定義好的枚舉常量賦值
3.1 定義
enum 枚舉名 { 枚舉變量 };示例:
enum week { Mon, Tues, Wed, Thurs, Fri, Sat, Sun}; typedef enum { Mon, Tues, Wed, Thurs, Fri, Sat, Sun }Date;枚舉是一種類(lèi)型,通過(guò)它可以定義枚舉變量:
Date a,b,c我們也可以給每個(gè)名字都指定一個(gè)值:
enum week{ Mon = 1, Tues = 2, Wed = 3, Thurs = 4, Fri = 5, Sat = 6, Sun = 7 };更為簡(jiǎn)單的方法是只給第一個(gè)名字指定值:
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun };這樣枚舉值就從 1 開(kāi)始遞增,跟上面的寫(xiě)法是等效的。
也可以在定義枚舉類(lèi)型的同時(shí)定義變量:
有了枚舉變量,就可以把列表中的值賦給它:
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun }; enum week a = Mon, b = Wed, c = Sat;或者:
enum week{ Mon = 1, Tues, Wed, Thurs, Fri, Sat, Sun } a = Mon, b = Wed, c = Sat;特點(diǎn):可以在定義枚舉時(shí)給成員賦值,被賦值的成員往后依次增加1,也可以在中間改變某一個(gè)成員的值。
3.1 引用
直接使用就行,需要注意的是**枚舉列表中的數(shù)據(jù)作用范圍是全局的,不能在定義與它們名字相同的白能量;Mon、Tues、Wed 等都是常量,不能對(duì)它們賦值,只能將它們的值賦給其他的變量。
示例:
Mon、Tues、Wed 這些名字都被替換成了對(duì)應(yīng)的數(shù)字。這意味著,Mon、Tues、Wed 等都不是變量,它們不占用數(shù)據(jù)區(qū)(常量區(qū)、全局?jǐn)?shù)據(jù)區(qū)、棧區(qū)和堆區(qū))的內(nèi)存,而是直接被編譯到命令里面,放到代碼區(qū),所以不能用&取得它們的地址。這就是枚舉的本質(zhì)。
本文章僅供學(xué)習(xí)交流用禁止用作商業(yè)用途,文中內(nèi)容來(lái)水枂編輯,如需轉(zhuǎn)載請(qǐng)告知,謝謝合作
微信公眾號(hào):zhjj0729
微博:文藝to青年
總結(jié)
- 上一篇: 护理专科男生当兵在部队能考资格证吗?
- 下一篇: codeforces——Little P