第四十一章 逆天改命的秘密
爺爺擺了擺手,然后就和奶奶坐在餐桌前,就著小籠包子和稀飯把早餐給對(duì)付了。
昨天我發(fā)燒暈過(guò)去后,老爹抱著我就往醫(yī)院跑,然后他和老媽就一直守在病床邊,寸步不離。老媽守到半夜就靠著老爹淺睡了一會(huì)兒,老爹繃緊了神經(jīng),硬是一宿沒(méi)有合眼。
這個(gè)時(shí)候放松下來(lái),再加上吃飽喝足,當(dāng)然是倦意來(lái)襲。要是我,多半早就倒在床上呼呼大睡了,可是這兩口子非要堅(jiān)持沖個(gè)澡再休息。
老爹明明已經(jīng)困得不行了,但還是沒(méi)有忘了女士?jī)?yōu)先的紳士風(fēng)度。女人就是麻煩,老媽足足洗了半個(gè)多小時(shí),老爹在沙發(fā)上坐著等都睡著了。
洗完澡,老爹老媽就回他們臥室休息去了。我感冒初愈,今天自然是不會(huì)有新的課程,閑來(lái)無(wú)事之際,我把老爹昨天講的和函數(shù)相關(guān)的知識(shí)回顧了一遍,進(jìn)而將推箱子的代碼打開(kāi),想著應(yīng)該如何將灰太狼移動(dòng)這部分用函數(shù)實(shí)現(xiàn)。
可是想了半天都無(wú)從下手,按捺住跑到老爹老媽臥室將老爹喊醒的沖動(dòng),我只好聯(lián)系小弦子,看看他能不能有什么好的辦法。
雖然我們倆在基本理論知識(shí)上面學(xué)得還不錯(cuò),但畢竟還缺少這方面的經(jīng)驗(yàn),一陣討論下來(lái),也沒(méi)有討論出個(gè)結(jié)果。
「連比我聰明的小弦子都不知道該怎么辦,那我不會(huì)也正常了?!?p> 我坦然地用這個(gè)理由說(shuō)服了自己。
既然沒(méi)有事情可以做了,不如玩兒兩把游戲放松放松。和小弦子開(kāi)黑玩兒兩局,我也漸漸感到倦意來(lái)襲……
新學(xué)期剛剛開(kāi)始,學(xué)習(xí)的內(nèi)容并不多。不知道是不是因?yàn)楹屠系鶎W(xué)習(xí)編程的緣故,我覺(jué)得書(shū)上的內(nèi)容超級(jí)簡(jiǎn)單易懂,基本上看一遍就會(huì)了。
等到老爹的課堂再次開(kāi)課時(shí),又是一周過(guò)去了。
星期六一早,我們一家剛剛吃過(guò)飯,小弦子便到了。不過(guò)這一次小弦子家有些興師動(dòng)眾,就連很久不見(jiàn)的六叔叔都來(lái)了!
他們大人聊了幾句后,老媽和小鹿阿姨相約去逛商場(chǎng),在問(wèn)我和小弦子要不要去的時(shí)候,我倆那頭要得跟撥浪鼓似的。
開(kāi)玩笑,跟著她們?nèi)ス渖虉?chǎng)不是自己找罪受么?腳桿走斷不說(shuō),還得給她們提東西,于是我和小弦子就躲在我臥室里邊玩兒游戲。
爺爺奶奶知道六叔叔和老爹有事情要談,也到小區(qū)遛彎兒去了,客廳中就剩下了老爹和六叔叔。
「新項(xiàng)目上出了點(diǎn)問(wèn)題,想聽(tīng)聽(tīng)你的意見(jiàn)。」
六叔叔還是那么直來(lái)直往,開(kāi)門(mén)見(jiàn)山。
老爹先從冰箱里給六叔叔拿了一瓶雪碧,又拿了幾包零食,這才坐在沙發(fā)上和六叔叔交談。
這一談就是一上午,我們的課程也順延到了下午。
因?yàn)橛辛迨宓募尤耄业呐P室自然容不下這么多人,于是老爹把上課地點(diǎn)轉(zhuǎn)移到了客廳中。為了我方便敲代碼,老爹將他上大學(xué)時(shí)買(mǎi)的那臺(tái)筆記本給我用了。
這電腦都快買(mǎi)了20年了,運(yùn)行的速度依然還是很快的,唯一的問(wèn)題就是電池一點(diǎn)都不耐用了。
一切準(zhǔn)備就緒后,老爹把他電腦屏幕投放在了投影儀上。
「上一周我們先聊了函數(shù),知道了什么是函數(shù),為什么要用函數(shù)以及如何使用函數(shù),接下來(lái)又說(shuō)到了變量的作用域、全局變量和局部變量。
最后說(shuō)到關(guān)鍵字static能夠幫局部變量逆天改命,讓局部變量成為與天地同壽的存在,小弦子提出疑問(wèn),static是如何做到的,于是就引出了C語(yǔ)言的程序運(yùn)行時(shí)在內(nèi)存中分區(qū)。
C語(yǔ)言的程序運(yùn)行時(shí)在內(nèi)存中的分區(qū)按照內(nèi)存地址從低到高一共分為:代碼區(qū)、常量區(qū)、全局?jǐn)?shù)據(jù)局、堆區(qū)、棧區(qū),其中代碼區(qū)和常量區(qū)已經(jīng)介紹過(guò)了。
代碼區(qū)存放的編譯成機(jī)器語(yǔ)言的程序代碼,CPU在執(zhí)行程序的時(shí)候,會(huì)挨著挨著讀取、執(zhí)行,最后在程序結(jié)束的時(shí)候由系統(tǒng)釋放。
常量區(qū)存放的是數(shù)字、字符、字符串等常量。至于什么常量,我們也用100塊買(mǎi)薯片的例子來(lái)說(shuō)明了。
這里要補(bǔ)充一點(diǎn),有個(gè)神奇的關(guān)鍵字能夠?qū)⒁粋€(gè)變量變成一個(gè)常量,它就是const,如果一個(gè)變量在聲明時(shí)被const修飾,那么這個(gè)變量就搖身一變,變成了一個(gè)常量。
這樣的變量需要在聲明時(shí)并對(duì)其初始化,一旦初始化完成后,這個(gè)變量就和其他常量一樣不能再修改了,就像這樣:
const int PIC_WIDTH = 50;
int const PIC_WIDTH = 50;
這兩條語(yǔ)句表達(dá)的意義都是一樣的,都是符合C語(yǔ)言規(guī)范的,你們可以選擇一種自己喜歡的方式,不過(guò)兩種方式都要認(rèn)識(shí),不然以后看到別人用另外一種方式還以為是人家用錯(cuò)了,那就糗大了。
被const修飾的全局變量,也就是全局常量也是放在常量區(qū)的。」
我和小弦子都都嘗試了一下,如果聲明一個(gè)被const修飾的變量不對(duì)其進(jìn)行初始化,編譯器會(huì)報(bào)錯(cuò)。如果初始化之后又對(duì)其進(jìn)行賦值,依然會(huì)報(bào)錯(cuò)。
「第三個(gè)區(qū):全局?jǐn)?shù)據(jù)區(qū),所有被static的變量和全局變量都是放在全局?jǐn)?shù)據(jù)區(qū)的,這個(gè)區(qū)也是在程序結(jié)束以后由系統(tǒng)釋放。
第四個(gè)?。憾褏^(qū),使用這個(gè)區(qū)就需要我們自己申請(qǐng)使用內(nèi)存了,并且還必須自己釋放。如果申請(qǐng)了內(nèi)存不釋放,就會(huì)導(dǎo)致內(nèi)存泄露。假設(shè)在一個(gè)死循環(huán)中不斷申請(qǐng)內(nèi)存并且不釋放的話(huà),那計(jì)算機(jī)秒秒鐘就會(huì)因?yàn)閮?nèi)存耗盡卡死了。
申請(qǐng)內(nèi)存的函數(shù)是malloc,釋放是free,都是由庫(kù)函數(shù)提供的。
最后一個(gè)區(qū):棧區(qū),所有除static修飾的局部變量都是放在這個(gè)區(qū)的,包括被const修飾的局部常量。一旦一個(gè)局部變量脫離了作用域,那么系統(tǒng)就會(huì)在棧中將它無(wú)情的殺死。
而static之所以能夠?yàn)榫植孔兞磕嫣旄拿褪且驗(yàn)楸凰揎椇蟮淖兞恳呀?jīng)從棧區(qū)轉(zhuǎn)移到了全局?jǐn)?shù)據(jù)區(qū),這個(gè)區(qū)里的數(shù)據(jù)要等到程序結(jié)束的時(shí)才會(huì)被釋放,都是和天地同壽的存在?!?p> 「哦哦,原來(lái)是這樣哦……」
難怪老爹要這么大的力氣給我們講內(nèi)存分區(qū),原來(lái)就是為了這一句話(huà)服務(wù)。
「static除了有給局部變量逆天改命,它還有另外一個(gè)技能——隱身術(shù)?!?