第五十章 指針(五)
得到了老爹的肯定后我是信心大增,繼續(xù)解讀后面兩句的含義。
「老爹,按照你說(shuō)的辦法,這第三句和第二句解讀出來(lái)的含義是一樣的啊,都是:p是一個(gè)變量,指向一個(gè)int常量?!?p> 我迷惑道。
同時(shí)我向小弦子投去了詢問(wèn)的神色,小弦子也是搖了搖頭,表示自己也沒(méi)用弄明白。
「這是因?yàn)閏onst來(lái)修飾一個(gè)變量的時(shí)候既可以放在數(shù)據(jù)類型前面,也可以放在數(shù)據(jù)類型后面,所以才導(dǎo)致了會(huì)出現(xiàn)這樣的情況。
至于你們選擇用哪一種形式,就看個(gè)人愛好了。」
「原來(lái)是這樣啊,那好吧。最后一句是:p是一個(gè)常量,指向一個(gè)int常量。這樣的話不但p的地址不能修改,*p也不能修改吧?」
「嗯,不錯(cuò),你們已經(jīng)掌握了指針和const結(jié)合的用法了。不過(guò)縱觀我這么多年寫代碼的經(jīng)驗(yàn),上面四句代表的三種的情況,一般int const*這種使用是最多的,int* const 和 int const* const這兩種用得比較少。
現(xiàn)在我們已經(jīng)知道了,指針變量指向一個(gè)地址,和這個(gè)地址對(duì)應(yīng)的可以是一個(gè)變量,也可以是一個(gè)數(shù)組。先前我們舉的例子都是一維數(shù)組,那指針變量是不是可以指向一個(gè)多維數(shù)組呢?比如說(shuō)二維數(shù)組。
答案當(dāng)然是可以的,當(dāng)你用一個(gè)指針指向一個(gè)多維數(shù)組的時(shí)候,你就會(huì)神奇地發(fā)現(xiàn),多維數(shù)組一下子就變成了一維數(shù)組,這恰好說(shuō)明了數(shù)組其實(shí)就是內(nèi)存中的一段連續(xù)空間。
具體的我這這里就不多講了,你們有興趣自己可以寫段代碼試一試。到這里,指針和數(shù)組的結(jié)合使用我基本上就講完了。
哦,對(duì)了,還忘了字符數(shù)組,瞧我這記性。唉,看來(lái)真的是老了。但凡是三十五歲前一天也不至于這樣啊?!?p> 老爹拍了拍自己的腦袋,感嘆一聲歲月催人老。
「其實(shí)將字符數(shù)組主要是為了講字符串,現(xiàn)在我們都知道字符串其實(shí)就是一個(gè)字符數(shù)組,以前我們表示一個(gè)字符串可能是這樣:
char str[]=“hello world“;
還記得這個(gè)字符數(shù)組長(zhǎng)度是多少么?」
「1……2……10……11……哦,不對(duì)!是12,用引號(hào)賦值的字符數(shù)組會(huì)自動(dòng)加上反斜杠0!」
「嗯,不錯(cuò)不錯(cuò),還記得這個(gè)!
現(xiàn)在有了指針,我們還可以用另外一種方式來(lái)表示字符串:
char* str =“hello world“;
這樣是不是更加簡(jiǎn)潔,優(yōu)雅?」
「不就省了一個(gè)字符嘛,有什么好簡(jiǎn)潔、優(yōu)雅的?」
我翻了一個(gè)白眼。
「好吧,蘿卜青菜,各有所愛。說(shuō)到這里,其實(shí)還有一種更加優(yōu)雅的寫法:
typedef char* String;
int main(int argc, char const* argv[])
{
String name =“zhangsan“;
printf(“%s“, name);
}
String就是字符串的意思,我們使用typedef關(guān)鍵字給char*取了一個(gè)別名叫String,所以別看有些人表面上叫String,其實(shí)背地里就是char*。
這里的typedef是個(gè)關(guān)鍵字,這家伙沒(méi)有什么別的愛好,就是喜歡給人取別名,以后在定義結(jié)構(gòu)體、枚舉類型的時(shí)候會(huì)經(jīng)常和它打交道,到時(shí)候你們就會(huì)喜歡上它的。」
「哦~,好吧?!?p> 「到這里呢,指針和數(shù)組結(jié)合的基本用法我就講完了。從進(jìn)入指針開始,理論性的東西就開始變得多了起來(lái),所以只是憑借我在課堂上講是遠(yuǎn)遠(yuǎn)不夠的,還需要多寫代碼練習(xí),這才能領(lǐng)悟其中的真諦。
既然說(shuō)完了數(shù)組和指針,那么我們接下來(lái)就要說(shuō)函數(shù)和指針結(jié)合的用法了。」
「啥?函數(shù)還能和指針扯上關(guān)系?」
「沒(méi)什么不可能的,不管是函數(shù)也好,變量也好,它們都是存在內(nèi)存當(dāng)中,既然在內(nèi)存中,自然是有地址的。既然有地址,那就難以逃脫指針的掌控。
說(shuō)一個(gè)不怎么恰當(dāng)?shù)谋扔鳎羔樉拖袷巧裨拏髡f(shuō)中的生死簿,一切都在其掌握之中!」
「那孫悟空不是將自己和那些猴子猴孫們從生死簿上劃去了么?」
「所以我才說(shuō)是不怎么恰當(dāng)?shù)谋扔靼。驗(yàn)樵诔绦蚴澜缰?,沒(méi)有任何事物能夠逃離指針的掌控。
也正因?yàn)槿绱耍绻荒苷_的使用指針就可能導(dǎo)致整個(gè)程序世界崩塌!」
老爹嚴(yán)肅地說(shuō)道。
「其實(shí)我們的操作系統(tǒng)也是一個(gè)程序,它在運(yùn)行的時(shí)候也要占用內(nèi)存。這就是為什么我的電腦一開機(jī)什么軟件都不運(yùn)行,內(nèi)存就會(huì)被占用百分之二十左右。
我們?cè)谑褂弥羔樀臅r(shí)候就可能讓其指定到和系統(tǒng)相關(guān)的內(nèi)存單元上,如果對(duì)其進(jìn)行修改就可能導(dǎo)致系統(tǒng)崩潰。
所以使用指針一定要小心,一個(gè)指針使用之前必須要為其初始化,并確認(rèn)其指向的位置。否則就可能被隨機(jī)分配到和系統(tǒng)相關(guān)的內(nèi)存,進(jìn)而導(dǎo)致可怕的后果?!?p> 「既然指針這么危險(xiǎn),為什么還要使用呢?」
「無(wú)論什么東西都是具有兩面性的,比如說(shuō)電能,能夠給我們提供便捷的生活,但同時(shí)也有可能對(duì)人造成傷害。
還有我們現(xiàn)在使用的電腦,其實(shí)在老爹讀書那個(gè)時(shí)代,很多人對(duì)電腦的存在也是持有不同的意見的。電腦可以用來(lái)學(xué)習(xí)、編程、進(jìn)行科學(xué)運(yùn)算、仿真等等,也可以用來(lái)娛樂(lè),游戲。
但是我像你們這么大的時(shí)候,電腦還沒(méi)有普及,特別想咱們老家農(nóng)村,根本就難得見到電腦的蹤影。
那時(shí)不少學(xué)生跑到網(wǎng)吧打游戲,沉迷于其中無(wú)法自拔,最終導(dǎo)致成績(jī)嚴(yán)重下滑,甚至于輟學(xué)。
很多家長(zhǎng)將其歸咎于電腦之上。
以前老爹寄居在雲(yún)姑姑家的時(shí)候,隔壁就上網(wǎng)吧,經(jīng)常看到很多家長(zhǎng)來(lái)網(wǎng)吧里面逮人,甚至于當(dāng)街打罵小孩兒,和網(wǎng)管發(fā)生沖突。
且不說(shuō)遠(yuǎn)了,就是我們家。一開始我讓玥玥接觸電腦的時(shí)候,爺爺奶奶還是反對(duì)的。
但是難道因?yàn)槿绱?,我們就不使用電腦了么?
指針的的確可能會(huì)導(dǎo)致程序,乃至系統(tǒng)崩潰,但是它能夠給我們帶來(lái)的好處也是毋庸置疑的,關(guān)鍵取決于使用的人!
佛家有云:『一念成佛,一念成魔?!?p> 我希望你們?cè)诳创魏问挛锏臅r(shí)候,不要只看到片面,最好像看待指針一樣,以辯證的方式分析它的兩面性。」