「C語言指標」原來是這樣,我已經完全懂了.老師:真的有點猛

在初學C語言時候,有些同學總會被一些比較長的語句嚇到啥啥啥?這寫的是啥?很多同學表示:字都認識,就是看不懂。

「C語言指標」原來是這樣,我已經完全懂了.老師:真的有點猛

本文就來帶著大家來學習一種超能力,就是看到一種說明語句,就能準確定位語句所描述的內容,或者說當自己需要某一種資料型別的時候,在型別定義的時候,說明語句怎麼寫,這是作為一個程式設計者所必備的能力。

「C語言指標」原來是這樣,我已經完全懂了.老師:真的有點猛

既然是分析說明語句,那麼第一個知識點顯然就是認識說明語句。什麼樣子的語句是說明語句呢?簡單,只要是以型別名開頭的語句,你就可以認為它是說明語句。

「C語言指標」原來是這樣,我已經完全懂了.老師:真的有點猛

我們先看最簡單的例子: int p; 顯然這是定義了一個整型變數p,那麼它是怎麼來的呢?是什麼樣的特性決定了我們這樣的理解呢?

顯然,我們是透過從左往右閱讀,看到了資料型別int,心中有數,這是一個整型,然後看到一個名字p,這是一個變數。所以連起來就是定義了“整型變數p”。

「C語言指標」原來是這樣,我已經完全懂了.老師:真的有點猛

把這樣的思路推廣一下,看另外一個例子: int *p; 從左往右,我們也看到了一個型別 int, 往後看到一個*p, 顯然*不可能是名字的組成部分,因為標誌符只能是由字母數字下劃線構成。

所以名字只能是p,而不是*p。 其實在瀏覽說明語句的時候,只要見到名字結合了*,就可以下結論:這是一個指標!

「C語言指標」原來是這樣,我已經完全懂了.老師:真的有點猛

那麼怎麼念呢?還是沿襲我們對於簡單說明語句int p;的解讀:碰到型別就唸型別名,碰到*就唸指標,碰到名字就唸變數。所以就變成了定義了一個“整型指標變數p”。

接著語句升級,看例子int **p; 從左往右看,找到的名字依然是p,名字結合了*,所以這也是一個指標,它可以指向某一種型別的資料。

「C語言指標」原來是這樣,我已經完全懂了.老師:真的有點猛

那麼,這個指標可以指向什麼樣子的資料呢?答案是:看剩餘部分,其實就是指標的基型別。

對於說明語句int **p; 除了指標標誌*和名字p之外,剩餘部分是int *,所以這樣的指標可以指向的資料型別是int *,可以存放int *型別資料的地址。

「C語言指標」原來是這樣,我已經完全懂了.老師:真的有點猛

那麼怎麼讀呢?按照我們最樸素的情感,依然是從左往右,連起來就是定義了一個“整型指標指標變數p”,也可以讀作“指向了整型指標的指標”,縮寫為二級指標。

接著是另一個例子int p[10];我們也可以從左往右看,顯然名字還是叫做p,但是出現了新的元素[],它也不是名字的組成部。那麼依然可以下結論:只要名字結合了[],那麼這就是陣列。所以這是“定義了一個長度為10的整型陣列p”。

「C語言指標」原來是這樣,我已經完全懂了.老師:真的有點猛

讓後接著升級:int *p[10]。前面我們說名字結合*就是指標,名字結合[]是陣列,那麼有*又有[]怎麼辦呢?答案是:看優先順序!

「C語言指標」原來是這樣,我已經完全懂了.老師:真的有點猛

根據優先順序規則,名字會先結合[],所以這是一個數組,陣列中每一個元素可以相當於什麼型別的變數來使用呢?依然是看剩餘部分(也就是陣列的基型別)。在這裡剩餘部分是int *,就表明了這是一個指標陣列,只不過裡面每一個元素都是一個整型指標。

「C語言指標」原來是這樣,我已經完全懂了.老師:真的有點猛

最後再來一個:int (*p)[10]。沿襲前面的思路就很明顯了,先找名字,找到名字是p,接著發現名字結合了*,所以下結論:這是一個指標!是一個指向什麼型別的指標由基型別決定,它的基型別是int [10],所以這是一個數組指標。

「C語言指標」原來是這樣,我已經完全懂了.老師:真的有點猛

沒有錯,就是這麼簡單。其實還有其他的說明語句,比如說函式指標,指標函式,結構體陣列,結構體指標等等,碰到的時候或者需要宣告某種型別的變數,可以沿用這樣的思路去順藤摸瓜,就會成竹在胸了。

感謝閱讀,學習使人強大。

「C語言指標」原來是這樣,我已經完全懂了.老師:真的有點猛