首頁 現實

程序媛養(yǎng)成計劃

第四十九章 指針(四)

程序媛養(yǎng)成計劃 任煦之秋 2108 2020-05-22 21:30:21

  但凡涉及到和內存相關的知識時,老爹都會使用PPT繪制圖形來輔助講解。如果沒有那些圖的話,理解起來還是有一些困難。

  「就然說到這里,就順便提一下指針的自加和自減。我們先回顧一下普通變量的自加和自減:

  int a = 10;

  對于a++等效于a = a + 1,a--等效于a = a - 1。

  那么對于指針變量

  int* p =&a;

  來說也是一樣的

  p++等效于p = p + 1,p--等效于p = p - 1。

  而我們剛剛才說過,對指針做加減運算,實際上是按照指針指向的數據類型為單位上下移動,如果我們再配合*的話,也可以對數組進行賦值或者取值,你比如說:

  int arr[5];

  int* p = arr;

  int i = sizeof(arr)/ sizeof(arr[0]);

  while(i--> 0)

  {

  scanf(%d, p++);

  }

  注意這里面有個兩個需要關注的地方,首先是老爹用sizeof來獲取了一個數組占用內存的字節(jié)數,如果這個地方換成sizeof(p)話,只會得到p這個變量占用的內存字節(jié)數,這是指針和數組名的區(qū)別之一。

  第二點,數組名是不可以做自加和自減操作的,不信你們可以把scanf函數中的p++換成a++,絕對會出錯?!?p>  雖然老爹無比篤定,但本著不「事不目見耳聞而臆斷其有無」的原則,我嘗試了一下,果然是報錯了。

  「那為什么會這樣呢?」

  「這個嘛,老爹也沒有看到過C語言是如何管理數組的,但是老爹猜測,arr是一個被const修飾的指針,何以見得?如果我們對變量p進行如下修改,就會發(fā)現p也不能執(zhí)行自加自減操作了。

  int* const p = arr;」

  「const會將一個變量變成常量,如果修飾一個指針是不是指針也變成了常量?」

  一直都沉默不語的小弦子出聲問道。

  「的確是這樣,和普通變量一樣,一個指針變量被const修飾后就變成了一個指針常量,那么我們就只能為其初始化一次,就不能再修改這個指針指向的地址了。例如:

  int a = 0;

  int b = 1;

  int* const p =&a;

  p =&b;

  在執(zhí)行最后一行代碼的時候肯定會出錯,因為指針變量被const修飾,并且已經為其賦值為變量a的地址了,就不能再做修改,這個應該看得懂吧?」

  見我和小弦子都點了點頭,老爹又接著說道:「雖然p指向的地址是不能再修改的,但并不影響我們修改這個地址對應的變量的值。換句話說:

  *p = 3;

  *p = 4;

  是不會出錯的!」

  「老爹你等等,我感覺有點繞了。」

  我突然覺得畫風轉變得有點快,讓人觸不及防,怎么就一下子就聽不明白了呢?

  「這樣啊,那我們來舉個例子好好捋一捋這其中的道道。

  假設哈,我是假設我們有一把萬能鑰匙,這把鑰匙能夠打開所有的保險箱?!?p>  「哇哦,那樣的話我們不是發(fā)財了么?那我們還編什么程啊,直接開個專業(yè)開保險柜的店不就好了么?但凡遇到找我們開保險柜的,都收百分之一的手續(xù)費,每天數毛爺爺手都得數抽筋?!?p>  別的不說,我入戲的速度還是很快的,老爹剛剛才做完設定,我就快速想好了下面的劇情。

  「你看不管是電視劇還是動漫,但凡那些坐擁寶物但是卻沒有對應守護寶物的實力,最終的下場一般都是家破人亡?!?p>  就在這個時候,小弦子幽幽說道。他的聲音就像是一盆冰水當頭淋下,把我編織的美好幻想凍得支離破碎。

  「這20后的小孩兒10歲都能知道這么多的東西么?」

  老爹捂著額頭,很是無語地看著我和小弦子。

  「哎呀,老爹,現在都2032年了,6G技術都已經投入商用了,你的思想不能還停留在上個世界90年代撒?!?p>  「別打岔,先聽我把例子說完!」

  趁著老爹看他自己電腦的時候,我偷偷地吐了吐舌頭,還向他做了個鬼臉。

  「好景不長,猶豫你保管不善,這把萬能鑰匙損壞了,到最后就只能打開一個保險柜咯。

  我們姑且認為,這把鑰匙就是一個指針變量,一開始它可以指向任何保險柜,但是在損壞后就只能打開那個唯一的保險柜了,這就和被const修飾了一樣。

  那么問題來了,難道因為鑰匙只能打開唯一的保險柜了之后,咱們就不能修改保險柜里面的內容了么?」

  「哦,原來是這個意思么?那我明白了?!?p>  我若有所思的點了點頭。

  「明白了?」

  「嗯~」

  「真的明白了?」

  「嗯~」

  「咱們歡樂加倍,來看看以下四種情況:

  int* const p;

  int const* p;

  const int* p;

  int const* const p;」

  「我勒個去,這個都是些什么鬼?」

  看著投影儀上面的這四句代碼,除了剛剛講過的第一句以外,其他三句在剎那間讓我進入懵逼狀態(tài)。

  一旁的小弦子也好不到哪里去,連舉著的杯子都停在了嘴邊,一時間忘記了喝水。

  「跌倒了沒?崩潰了沒?」

  看著我和小弦子的表情,三十多歲的老爹居然開始幸災樂禍??催@樣子,是要把他當年受過的虐轉移到我們身上啊。

  「哈哈,你們這表情就跟當年我參加二級考試遇到這道題時的表情一模一樣,不瞞你們說,事后我認真的研究過,結果久了不用,很快就忘了。等到大學畢業(yè)找工作的時候,面試時我再次在此敗下陣來。

  后來我痛定思痛,終于總結出來了一個小技巧?!?p>  「什么技巧啊?」

  我眼睛瞬間就開始放光了,仿佛看到了絕世珍寶。

  「好吧,那我就將老爹歷經數載悟出的真諦傳授于你們,希望你們能替老爹我發(fā)揚光大。

  但凡遇到指針和const,咱們就把代碼倒過來讀,也就是從由往左讀,遇到*就替換為『指向』二字。

  按照這個規(guī)則,第一句讀出來就是:p是一個常數,指向一個int類型。就然p是一個常量,那么它的值(指向的地址)是不能夠改變的,但是被它指向的地址中的內容(保險柜中的內容)修改不受到限制。

  那你們來試試后面的。」

  「p是一個指向int型常量的變量……」

  「對頭,咱們來做一個你們最熟悉的縮句,最終的結果是……」

  「p是一個變量?!?p>  「冰狗,對了。既然p是一個指針變量,它指向的地址自然是可以改變的,但是它指向的是一個int型常量,所以*p = 5這種賦值操作肯定就不行了?!?p>  

按 “鍵盤左鍵←” 返回上一章  按 “鍵盤右鍵→” 進入下一章  按 “空格鍵” 向下滾動
目錄
目錄
設置
設置
書架
加入書架
書頁
返回書頁
指南