還不登入嗎?
(-3-)是不是要下跪求你們?
趕快為了可愛的管理員登入喔。
登入可以得到收藏功能列表
還能夠讓我們知道你們有在支持狂人喔(*´∀`)~♥
《程序媛養成計劃》第47章 指針(2)
  「理論上應該沒有問題的呀,要實現交換兩個變量的值容易得很!可是老爹的笑容讓我心裡一陣發毛……這其中絕對有貓膩!」

  面對老爹提出的疑問,原本信心滿滿地我瞬間失去了所有的底氣。一旁的小弦子雖然沒有吭聲,眉頭卻是皺得跟個小老頭兒似的。

  有道是實踐是檢驗檢驗真理的唯一準則,是騾子是馬,拉出來溜溜不就知道結果了麽?

  於是乎我三下五除二就寫好了swap函數,為了謹慎起見,我還在函數中打印了交換前後的值。

  以我如今的水品寫這種簡單的代碼出錯的幾率還是很小的,編譯運行一氣呵成,小黑屏上打印出來的結果的的確確顯示兩個變量的值已經成功交換了。

  「這是幾個意思?難道老爹是在故布疑陣,唱空城計?」

  小弦子看到我咬手指甲,面露沉思,於是也把腦袋湊過來看了一眼顯示屏,隨即開始捏著下巴冥思苦想。

  「老爹,打印的結果明明顯示交換成功了呀!」

  為了穩妥起見,我還進行了單步調試,可是一切都按照預期的流程執行,結果也是預期的結果。最終我還是沒有發現問題到底出在哪裡,於是只能向老爹求助。

  「我可沒有讓你打印形式參數x,y的值,我說的是交換實際參數a和b的值,也就是這樣:

  int a = 3;

  int b = 4;

  swap(a,b);

  printf(“a =%d\n“, a);

  printf(“b =%d\n“, b);」

  「橋豆麻袋,形式參數……實際參數又是從哪兒冒出來的新名詞啊?」

  「哦,這點是我的疏忽,在給你們講函數這一部分知識的時候忘了說。函數參數列表中的變量叫做形式參數,比如說:

  swap(int x, int y)

  這裡的x和y就就做形式參數。

  而我們在調用函數時,為函數傳遞的參數,這個就叫實際參數,例如:

  swap(a,b)

  a和b就是實際參數。

  而我剛剛提出的要求是要交換兩個是實際參數的變量,所以我們應該監控a和b在調用函數的前後的變化。」

  明白了老爹的意圖後,我對代碼進行了更改,然後重新編譯、運行。

  「WHAT!」

  看到小黑屏上打印的結果後,我沒有忍住喊了出來。因為屏幕上打印的結果顯示,a和b在調用swap函數前後居然沒有任何變化!我簡直不敢相信自己的眼睛,這就好比你用計算器計算1+1的值,它妹的居然給你顯示1+1=3!

  為了委托期間,我重啟了電腦又執行了幾次,但是結果都是一樣的!換句話說,swap函數交換a和b的值失敗了,但是函數分明已經是執行了的!

  「老爹,這是怎麽回事兒啊?」

  我實在是想不通這其中的症結所在,只能夠向老爹提問。

  「這就要從函數參數的傳遞問題開始說起了。

  在C語言中,我們在調用函數的時候,參數的傳遞實際上是采用的值的傳遞方式,什麽意思呢?

  就拿我們剛剛舉那個例子來說,當我們在調用swap(a,b)的時候,實際上是把a的值3複製了一份給變量x,而不是a這個變量換了一個名字,變成了x。同理,變量b的值4複製了一份給y。

而x和y跟a和b沒有任何關系,所以在函數中無論我們對x和y做什麽操作,都不會影響到a和b,所以對a和b進行值交換沒有成功。」  「原來如此!那用指針為什麽就能達到這個效果呢?」

  我點了點頭,然後拋出了自己的疑問。

  「誒,我什麽時候說了用指針可以實現這個功能?」

  「雖然任叔叔你沒有明說,但是你特地挖了一個坑讓我和玥玥往裡面跳,肯定是別有目的的。既然現在咱們正好在學習指針,再加上剛剛我和玥玥都對指針的強大表示懷疑,你自然是要想辦法來說服我們呀!」

  我還沒有開口,小弦子倒是按捺不住了。

  「你們兩個……」

  見自己的心思被我們看穿,老爹有些無語。

  「好吧,那我先給你們演示用指針怎麽來實現剛剛的功能:

  swap(int* x, int* y)

  {

  int temp =*x;

  *x =*y;

  *y = temp;

  }

  int main(int argc, char const *argv[])

  {

  int a = 3;

  int b = 4;

  swap(&a,&b);

  }

  這樣的話,就能夠實現交換a和b中的值了。」

  雖然老爹一幅信誓旦旦的樣子,但我和小弦子剛剛才折戟沉沙,自然會先驗證一遍。一切果然如同老爹所言,a和b中的內容果然變了!那麽why?how?

  「好了,到這裡我們正式進入正題,只有我們將指針的知識講了,你們才會明白這其中的緣由。

  剛剛我們說過,指針,其實就是指向一個變量的地址,這裡的地址無非就是一個數字。通常的數據,如int、double這種,我們都是放在一個變量中,然後使用它們。同樣的,如果我們使用這些地址,也得有相應的數據類型類存放,而用來存放地址的變量,就叫做指針變量。

  就拿swap函數的參數列表來說,int* x其實就是聲明了一個指向int類型的指針變量x。

  什麽意思呢?這其中其實包含了對內存的讀寫信息。

  舉個例子,假設你們班的教室編號是520,因為你們老師教學水平太高了,受到了廣大學生和家長的認可,於是大家都想進入你們班學習。

  於是你們班上的學生就越來越多,一個教室已經裝不下了,這個時候校長說把521、522、523這三間教室跟你教室打通。

  但是這四間教室只有520這個編碼,如果這個時候有人問四年級二班在哪兒,我們就需要告訴人家,520編號的四間教室都是。

  同樣,因為不同的數據類型佔用的內存字節不同,比如說變量a,它是一個int類型的,那麽它在內存中佔4個字節。但是我們獲取它的指針地址時,獲取到的實際上是它的首個字節的地址,因此我們在使用指針的時候就必須告訴計算機要取幾個字節。

  int*的意思就是一個指向int數據類型的指針,這樣聲明計算機就知道,原來使用這個指針地址讀寫數據的時候要按照int類型的標準來,也就是要從當前地址開始,操作四個字節的內存。

  同樣的,如果我們聲明一個執行double類型的指針變量,就要用double*,以此類推。」
鍵盤左右鍵 ← → 可以切換章節
章節問題回報:
翻譯有問題
章節內容不符
章節內容空白
章節內容殘缺
上下章節連動錯誤
小說很久沒更新了
章節顯示『本章節內容更新中』
其他訊息