天天看點

解答部落客西方失敗2913312169的C指針問題

   CU部落客西方失敗2913312169,在博文《聲明數組參數》中抛出了C語言指針的函數參數傳遞問題,原文連結如下:

   這是中國學生的老問題了,怪我們老師沒教好,是以現在特地詳細解釋一下。首先要說明幾個基本原則:

   1、數組名是位址常量,也即指針常量。但通常省略了一個限定範圍,即函數體内。函數體内,如main或自定義函數等體内定義的數組名都是位址常量。不能用++或--這類的自增或自減運算符,當然也不能用a+=1,畢竟常量不能作為左值。這是了解指針的第一個前提。

   2、*與&為互逆的兩個運算符,分為是取值和取址。對于int a = 0;那麼&a就是a變量的位址,而*(&a)就是按變量類型int取出a變量存放值的空間中的值。

   3、C語言裡指針有兩級,一級指針(指向位址的指針)和二級指針(指向位址指針的指針),都是指向位址但層次不同,一級和二級指針可以指向同一位址,但方向不同。例如:a[3][3]。a是二級指針,a+1向下跳一行,(*a)是一級指針,(*a)+1向後跳一列。對二級指針取值,就把指針指向也即移動機關進行了變換(實質上是完成了一種特殊類型的轉換),*a就等于&(a[0][0])。這是了解指針的第二個前提。需要注意的是,所謂的兩級指針并非連結清單那種你連我,我連他,千萬别誤以為連結清單中的第一個是一級指針,第二個是二級指針,第三個指針是三級指針,其實連結清單裡的連結指向指針都屬于一級指針。

    4、好了開始說關鍵之處吧,在函數定義時,參數的作用是接收其它傳入值,不管這個值是否為指針。當然了,形參可以是變量,或預設常量,如果是預設常量,隻能定義在參數清單的後面。你這裡的定義并非預設常量,是以該形參是一個變量。這就是為什麼說在作為參數時, 數組和指針是等價的,因為發生拷貝出現了值傳遞,const直接轉為了non-const。于是,可以認為函數形參定義的括号内并非嚴格屬于函數體内。

   我專門寫了一個小程式,如下:

解答部落客西方失敗2913312169的C指針問題
解答部落客西方失敗2913312169的C指針問題

   請你思考下并自測一下,為什麼是下面這個答案?

解答部落客西方失敗2913312169的C指針問題

   呵呵,雖然這個例子有點難度,但希望本貼對你真正有用。有什麼想法,咱們一起讨論。如有不正确之處,也請指正。

繼續閱讀