C語言的結(jié)構(gòu)體是非常重要的語法,畢竟當(dāng)初祖師爺發(fā)明C語言的其中一個(gè)首要任務(wù)就是要能提供數(shù)據(jù)的結(jié)構(gòu)化。題主覺得結(jié)構(gòu)體難,估計(jì)是因?yàn)槌鯇W(xué)C語言的緣故。
還記得剛開始接觸C語言的時(shí)候,為了描述一個(gè)平行四邊形的邊長和對(duì)角線長,我定義了四個(gè)變量:短邊長a,長邊長b,對(duì)角線1長d1,對(duì)角線2長d2。
在寫代碼的過程中,發(fā)現(xiàn)又要定義一個(gè)平行四邊形,于是我不得不又定義了四個(gè)變量:a2,b2,d12,d22,結(jié)果變量又多又亂,寫代碼很不舒服,太容易弄混了。當(dāng)時(shí)我還想,幸好沒有第三個(gè),第四個(gè)平行四邊形。
后來,我發(fā)現(xiàn)原來C語言原來還有結(jié)構(gòu)體這種語法,不禁感嘆當(dāng)初我那種做法實(shí)在是太笨了。
C語言中的結(jié)構(gòu)體(復(fù)合數(shù)據(jù)類型)
C語言初學(xué)者最先接觸到的數(shù)據(jù)類型大多都只具有單一的值,例如整數(shù),字符,真假值,小數(shù),在C語言中(或者說編程語言中)這些數(shù)據(jù)類型通常被稱作基本數(shù)據(jù)類型。
事實(shí)上,C語言中還有復(fù)合數(shù)據(jù)類型
用C語言制定一個(gè)描述平行四邊形邊長和對(duì)角線長的結(jié)構(gòu)體數(shù)據(jù)類型。
這個(gè)需求是容易實(shí)現(xiàn)的,我們用double類型來描述“長度”,那么結(jié)構(gòu)體可以如下定義:
要注意的是,結(jié)構(gòu)體定義完后,大括號(hào)后面要用“;”結(jié)束。parallelogram并不表示一個(gè)變量,它表示一種復(fù)合數(shù)據(jù)類型,structparallelogram{doublea,b,d1,d2;}整體可以看做一個(gè)就像int,double一樣的數(shù)據(jù)類型。那怎么使用它呢?請(qǐng)看下面的C語言代碼實(shí)例:
這樣我們就定義好了p1和p2兩個(gè)結(jié)構(gòu)體變量。事實(shí)上,定義好結(jié)構(gòu)體數(shù)據(jù)類型之后,可以只使用structparallelogram來定義變量,請(qǐng)看:
這樣定義的p3和p4與上面那種方式定義的p1和p2是一樣的。如果采用上面那種定義方式,parallelogram也可以不寫:
但是這樣就沒有辦法再引用這個(gè)結(jié)構(gòu)體類型了,因?yàn)樗鼪]有名字。定義好變量后,就可以用“.”運(yùn)算符來訪問結(jié)構(gòu)體的各個(gè)成員了。例如:
很明顯,用結(jié)構(gòu)體來描述平行四邊形的邊長問題,比定義多個(gè)double變量方便多了。只需要用structparallelogram定義一個(gè)變量,這個(gè)變量自己內(nèi)部就有平行四邊形的短邊長,長邊長,對(duì)角線1長和對(duì)角線2長了。而且不會(huì)弄混,p1和p2的成員彼此是隔離的,使用“p1.”訪問的變量肯定是p1的。這樣一來,要定義再多的平行四邊形都不怕了。
C語言結(jié)構(gòu)體的初始化
我們使用基礎(chǔ)數(shù)據(jù)類型時(shí),初始化很方便,直接賦值就可以了,結(jié)構(gòu)體怎么初始化呢?請(qǐng)看下面的C語言代碼:
這幾種方式都是可以的,只不過要是使用第一種方式定義,p1必須是局部變量。p1若是全局變量,就只能用常數(shù)表達(dá)式定義了。
另外需要特別注意的是,一旦變量定義好了,就不能直接用下面種方式賦值了,但是同類型之間可以賦值:
我們用一個(gè)完整的例子結(jié)束本節(jié),請(qǐng)看下面的C語言代碼:
編譯并執(zhí)行,得到如下結(jié)果:
注意,上面定義的變量a與結(jié)構(gòu)體里的a并不沖突,因?yàn)榻Y(jié)構(gòu)體里的a是用過“.”運(yùn)算符訪問的,編譯器可以區(qū)分,它們屬于不同的命名空間。
好了,學(xué)會(huì)了C語言的結(jié)構(gòu)體,就算是要描述一只貓,也不怕了。
小結(jié)
到這里,相信題主應(yīng)該能發(fā)現(xiàn)C語言結(jié)構(gòu)體的方便之處了。事實(shí)上,結(jié)構(gòu)體的用處非常大,如果題主閱讀我的文章,應(yīng)該會(huì)發(fā)現(xiàn),結(jié)構(gòu)體和指針結(jié)合起來,簡(jiǎn)直“毀天滅地”,能夠?qū)崿F(xiàn)各種各樣好玩的特性。
歡迎在評(píng)論區(qū)一起討論,質(zhì)疑。文章都是手打原創(chuàng),每天最淺顯的介紹C語言、linux等嵌入式開發(fā),喜歡我的文章就關(guān)注一波吧,可以看到最新更新和之前的文章哦。