因?qū)W習(xí)需要,筆者在周末又拿出這本大一學(xué)的C語言程序設(shè)計通讀了一遍,一共用時3天,可以說只是泛讀,不是很仔細(xì).
先說說收獲吧,由于之前大一時學(xué)習(xí)不甚認(rèn)真,導(dǎo)致一些基礎(chǔ)的東西掌握不扎實,此次通讀后,感覺很多認(rèn)知觀都刷新了.C語言確實是了解底層的最好的語言,一些學(xué)習(xí)Java的不太清晰的點現(xiàn)在有了了解.
再談?wù)凜的左膀右臂:強(qiáng)轉(zhuǎn)和指針.強(qiáng)轉(zhuǎn)是指由一種抽象結(jié)構(gòu)強(qiáng)行變成另一種抽象結(jié)構(gòu),說它是左膀其實感覺有點言過其實,可能是筆者水平的原因,在一些方面看來,指針的作用比強(qiáng)轉(zhuǎn)大多了,在沒有指針的情況下,想在C語言這樣的結(jié)構(gòu)型編程語言中改變一個形參的值,可能只能通過構(gòu)建一個數(shù)組來完成,因為數(shù)組是傳遞的首地址.從這點角度來看,數(shù)組其實也能看成一種指針.指針的作用遠(yuǎn)不止如此,在C語言中,數(shù)組是固定長度且不能改變大小的(跟Java一樣,當(dāng)然,我們不談JS),這是因為給數(shù)組大小就是申請內(nèi)存的過程,使用:
length*sizeof(Type)
來確定分配的內(nèi)存,而有些操作必須要不限制長度的數(shù)組,C語言封裝了在heap上的動態(tài)數(shù)組來實現(xiàn)的.但是如果能寫入一個數(shù)據(jù)就動態(tài)的給予內(nèi)存,內(nèi)存在物理上不連續(xù)(其實就是鏈表啦...),利用底層語言的內(nèi)存優(yōu)勢,寫一個更好的ArrayList就好了.
解決這個問題,可以使用結(jié)構(gòu)體里面寫入指針來存儲鏈表下一個內(nèi)存的物理地址,同時,用一個基礎(chǔ)類型存儲一下數(shù)據(jù)(也可以嵌套結(jié)構(gòu)體來完成更復(fù)雜的鏈表),這樣,指針的另一個特色:固定長度的優(yōu)勢就發(fā)揮出來了.為什么是固定長度的優(yōu)勢呢?因為如果把指針改成鏈表的下一個結(jié)構(gòu)體來的話,結(jié)構(gòu)體會出現(xiàn)語法錯誤,結(jié)構(gòu)體不能包含本結(jié)構(gòu)體成員,自身結(jié)構(gòu)體的內(nèi)存字節(jié)數(shù)不確定.
最后說說某些疑惑的地方,可能只是因為沒仔細(xì)讀.第一是函數(shù)指針,講解過少,筆者認(rèn)為這個指針會在某些場合內(nèi)大放異彩,是構(gòu)建一個強(qiáng)擴(kuò)展程序的必要組件.第二是構(gòu)建圖,樹等其他數(shù)據(jù)結(jié)構(gòu),本書沒有提及.第三是指針,本書于第九章提出指針概念后,后面幾乎每一章講此章內(nèi)容與指針的關(guān)系,為此引申出新的指針子類出來,但是由于沒有總體的歸納,可能會使學(xué)生知識體系架構(gòu)不算清晰.最后是一個小點:在動態(tài)數(shù)組里malloc()與calloc(),從安全角度calloc更好,但是書中沒有在其他地方使用過,可能是malloc()更靈活的緣故吧.
最近又買了《C和指針》《C 陷阱與缺陷》來精讀,提高對C語言認(rèn)知與底層操作的理解.