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