還不登入嗎?
(-3-)是不是要下跪求你們?
趕快為了可愛的管理員登入喔。
登入可以得到收藏功能列表
還能夠讓我們知道你們有在支持狂人喔(*´∀`)~♥
《程序媛養成計劃》第49章 指針(4)
  但凡涉及到和內存相關的知識時,老爹都會使用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來獲取了一個數組佔用內存的字節數,如果這個地方換成sizeof(p)話,只會得到p這個變量佔用的內存字節數,這是指針和數組名的區別之一。

  第二點,數組名是不可以做自加和自減操作的,不信你們可以把scanf函數中的p++換成a++,絕對會出錯。」

  雖然老爹無比篤定,但本著不「事不目見耳聞而臆斷其有無」的原則,我嘗試了一下,果然是報錯了。

  「那為什麽會這樣呢?」

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

  int* const p = arr;」

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

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

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

  int a = 0;

  int b = 1;

  int* const p =&a;

  p =&b;

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

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

  *p = 3;

  *p = 4;

  是不會出錯的!」

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

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

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

  假設哈,我是假設我們有一把萬能鑰匙,

這把鑰匙能夠打開所有的保險箱。」  「哇哦,那樣的話我們不是發財了麽?那我們還編什麽程啊,直接開個專業開保險櫃的店不就好了麽?但凡遇到找我們開保險櫃的,都收百分之一的手續費,每天數毛爺爺手都得數抽筋。」

  別的不說,我入戲的速度還是很快的,老爹剛剛才做完設定,我就快速想好了下面的劇情。

  「你看不管是電視劇還是動漫,但凡那些坐擁寶物但是卻沒有對應守護寶物的實力,最終的下場一般都是家破人亡。」

  就在這個時候,小弦子幽幽說道。他的聲音就像是一盆冰水當頭淋下,把我編織的美好幻想凍得支離破碎。

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

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

  「哎呀,老爹,現在都2032年了,6G技術都已經投入商用了,你的思想不能還停留在上個世界90年代撒。」

  「別打岔,先聽我把例子說完!」

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

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

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

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

  「哦,原來是這個意思麽?那我明白了。」

  我若有所思的點了點頭。

  「明白了?」

  「嗯~」

  「真的明白了?」

  「嗯~」

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

  int* const p;

  int const* p;

  int* const p;

  int const* const p;」

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

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

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

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

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

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

  後來我痛定思痛,終於總結出來了一個小技巧。」

  「什麽技巧啊?」

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

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

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

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

  那你們來試試後面的。」

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

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

  「p是一個變量。」

  「冰狗,對了。既然p是一個指針變量,它指向的地址自然是可以改變的,但是它指向的是一個int型常量,所以*p = 5這種賦值操作肯定就不行了。」
鍵盤左右鍵 ← → 可以切換章節
章節問題回報:
翻譯有問題
章節內容不符
章節內容空白
章節內容殘缺
上下章節連動錯誤
小說很久沒更新了
章節顯示『本章節內容更新中』
其他訊息