【C语言笔记初级篇】第七章:结构体相关
目錄
(1)結(jié)構(gòu)體的聲明,定義,初始化和成員訪問
A:什么是結(jié)構(gòu)體
B:結(jié)構(gòu)體聲明和定義
C:結(jié)構(gòu)體的初始化
D:成員訪問
(2)結(jié)構(gòu)體傳參
(3)結(jié)構(gòu)體自引用
(4)內(nèi)存對齊
(5)結(jié)構(gòu)體傳參
(6)位段
(1)結(jié)構(gòu)體的聲明,定義,初始化和成員訪問
A:什么是結(jié)構(gòu)體
世界上物體的性質(zhì)是復(fù)雜多樣的,就拿人而言,人絕對不能用一個(gè)整形數(shù)據(jù)(比如說身高),或者說字符串(比如說姓名)而單獨(dú)囊括的,于是我們在描述一個(gè)復(fù)雜對象的時(shí)候,就要使用的結(jié)構(gòu)體,結(jié)構(gòu)體是一些值的集合,這些值稱為成員變量,每個(gè)成員變量可以是不同的類型
B:結(jié)構(gòu)體聲明和定義
比如這里我們要描述一個(gè)學(xué)生,一個(gè)學(xué)生的信息主要包括姓名,年齡和學(xué)號(hào)組成
上述我們在main函數(shù)中通過,定義的struct Student 創(chuàng)建了一個(gè)結(jié)構(gòu)體變量S,這樣的創(chuàng)建方式屬于局部變量
我們還可以直接在參數(shù)列表處直接定義,這樣定義的就是全局變量
還有我們經(jīng)常在數(shù)據(jù)結(jié)構(gòu)中見到的一種寫法,它其實(shí)相等于就是重新命了一個(gè)名字
C:結(jié)構(gòu)體的初始化
第一點(diǎn):普通初始化
第二點(diǎn):嵌套初始化
結(jié)構(gòu)體的成員可以是標(biāo)量,數(shù)組,指針,甚至是其他結(jié)構(gòu)體
D:成員訪問
上述循環(huán)嵌套的訪問方式如下
(2)結(jié)構(gòu)體傳參
結(jié)構(gòu)體不能直接使用printf函數(shù)打印,需要打印時(shí)可以自己封裝print函數(shù),而這就涉及到了傳參和傳遞地址的問題,結(jié)合前面第五章講到的結(jié)構(gòu)體指針的相關(guān)知識(shí),就有以下兩種打印方式
由于結(jié)構(gòu)體的數(shù)據(jù)比較多,所以我們以后在操作時(shí)要傳結(jié)構(gòu)體的地址,如果傳結(jié)構(gòu)體的值那么對于內(nèi)存的開銷就比較大,如果傳入地址,則只需使用一個(gè)很小的指針就能操作
(3)結(jié)構(gòu)體自引用
這里以單鏈表結(jié)點(diǎn)定義為例。一個(gè)結(jié)構(gòu)體有兩個(gè)部分,一個(gè)部分是數(shù)據(jù)域,一個(gè)部分是指針域,在創(chuàng)造結(jié)點(diǎn)也就是建立結(jié)構(gòu)體成員時(shí),每個(gè)成員除了有一個(gè)數(shù)據(jù)域用來存放數(shù)據(jù)外還有一個(gè)指針域,在指針域里面存放的是一個(gè)地址,這個(gè)地址指向下一個(gè)結(jié)點(diǎn)也就是下一個(gè)結(jié)構(gòu)體成員的內(nèi)存地址
(4)內(nèi)存對齊
具體參見:C語言重難點(diǎn):內(nèi)存對齊和位段_快樂江湖的博客-CSDN博客一:結(jié)構(gòu)體內(nèi)存對齊(1)為什么要存在內(nèi)存對齊平臺(tái)原因(移植原因): 不是所有的硬件平臺(tái)都能訪問任意地址上的任意數(shù)據(jù)的;某些平臺(tái)只能在某些地址處取得某些特定類型的數(shù)據(jù),否則拋出硬件異常。比如,當(dāng)一個(gè)平臺(tái)要取一個(gè)整型數(shù)據(jù)時(shí)只能在地址為4的倍數(shù)的位置取得,那么這時(shí)就需要內(nèi)存對齊,否則無法訪問到該整型數(shù)據(jù)。性能原因:數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能的在自然邊界上對齊。原因在于,為了訪問未對齊內(nèi)存,處理器需要作兩次內(nèi)存訪問;而對齊的內(nèi)存訪問僅需一次。核心思想就是:以空間換取時(shí)間(2)結(jié)構(gòu)體對齊規(guī)則https://blog.csdn.net/qq_39183034/article/details/116457144
(5)結(jié)構(gòu)體傳參
和前面說過的交換兩個(gè)變量的經(jīng)典例子一樣,對結(jié)構(gòu)體內(nèi)的變量進(jìn)行修改時(shí)需要傳入地址,用結(jié)構(gòu)體指針來接受,如果只是去使用結(jié)構(gòu)體變量的值的話,就只傳入值即可
(6)位段
具體參見
C語言重難點(diǎn):內(nèi)存對齊和位段_快樂江湖的博客-CSDN博客一:結(jié)構(gòu)體內(nèi)存對齊(1)為什么要存在內(nèi)存對齊平臺(tái)原因(移植原因): 不是所有的硬件平臺(tái)都能訪問任意地址上的任意數(shù)據(jù)的;某些平臺(tái)只能在某些地址處取得某些特定類型的數(shù)據(jù),否則拋出硬件異常。比如,當(dāng)一個(gè)平臺(tái)要取一個(gè)整型數(shù)據(jù)時(shí)只能在地址為4的倍數(shù)的位置取得,那么這時(shí)就需要內(nèi)存對齊,否則無法訪問到該整型數(shù)據(jù)。性能原因:數(shù)據(jù)結(jié)構(gòu)(尤其是棧)應(yīng)該盡可能的在自然邊界上對齊。原因在于,為了訪問未對齊內(nèi)存,處理器需要作兩次內(nèi)存訪問;而對齊的內(nèi)存訪問僅需一次。核心思想就是:以空間換取時(shí)間(2)結(jié)構(gòu)體對齊規(guī)則https://blog.csdn.net/qq_39183034/article/details/116457144
總結(jié)
以上是生活随笔為你收集整理的【C语言笔记初级篇】第七章:结构体相关的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (软件工程复习核心重点)第四章总体设计-
- 下一篇: '0','\0',NULL,EOF的区别