C語言變數修飾符結合方向和優先順序

2021-10-23 13:25:16 字數 1319 閱讀 6627

要理解指標, 尤其是和一些其他型別修飾符放在一起的指標, 看上去很難,其實不然。

乙個型別宣告裡會出現很多修飾符,他們就像普通的表示式一樣,有優先順序和結合性。只要掌握了這些規律,

分析乙個複雜的指標型別就很容易了。

分析時, 先從變數名開始,然後根據修飾符的優先順序結合性,一步一步分析。

下面看幾個最常用的例子:

int p;  // 普通的int變數

int *p; // 首先從p開始, p先與*結合,表明p是乙個指標。然後再與int結合, 表明p指向的是int型別。所以p是乙個指向int型別的指標。

一般的,我們稱之為整型指標。

int  p[3] : p先與結合,表明p是乙個陣列。然後與int結合,表明陣列的元素是int型別的。因此p是乙個整型的陣列。

int *p[3]: 的優先順序比*高,所以p先與結合,表明p是乙個陣列,再與*結合,表明陣列裡的元素是指標。再與int結合,表明指標指向的是int。所以p是乙個陣列,陣列元素是整型指標(int*). 很多書裡說陣列就是指標,這是不確切的。陣列和指標是兩個不同的型別。切記!

int (*p)[3] : 這裡的括號,讓p與*先結合。表明p是乙個指標。然後再與結合,表明指標指向的型別是陣列。再與int結合,表明陣列的元素是int型別的。 所以p是乙個指向整型陣列的指標。

在這裡,int *和int (*)是兩個不同的型別。

int **p; p為典型的二級指標。

int p(int): p首先與()結合,表明p是乙個函式。進入()分析,說明該函式有乙個int型別的引數。再與外面的int結合,表明函式的返回值是乙個int。 所以p是乙個引數型別為int,返回值為int的函式。

int (*p)(int) : 從p處開始,先與指標結合,表明p是乙個指標。然後再與()結合,表明該指標指向的是乙個函式。然後再與()裡的int結合,表明函式有乙個int型別的引數。再與最外層的int結合,表明函式的返回值是int。 這裡的p是乙個典型的函式指標。

int *(*p(int))[3] : 這個看上去很複雜。從p開始,先與()結合,表明p是乙個函式,然後進入(),與int結合,表明函式的引數為int。

再與外面的*結合,表明函式的返回值型別是指標。然後再到最外面一層,先與結合,表明返回指標指向的是乙個數                               組。再與最外面的*結合,表明陣列的元素是指標,再與最後的int結合,表明陣列的元素指標指向的是int型別。

所以p是乙個函式, 引數為int, 返回值為指向int* 的指標。

這確實很複雜,同樣的,對於編譯器的設計來說,更為複雜。但是這也是c為什麼長盛不衰的原因了。因為c的設計真的很精妙。發明

c語言的是個天才。我只能這樣說。

C 修飾符 類修飾符和成員修飾符

c 修飾符之類修飾符 public internal partial abstract sealed static internal 本程式集內的成員可以訪問。partial 部分類,可以將乙個類分成幾部分寫在不同檔案中,最終編譯時將合併成乙個檔案,且各個部分不能分散在不同程式集中。c 修飾符之成員...

C語言 變數 常量 訪問修飾符

變數 1 變數名實際上是乙個符號位址 在編譯連線時由系統分配給每乙個變數的記憶體位址 2 基本型別變數 字元型變數 char 整型變數 int 實型變數 float double 無值型變數 void 表示乙個函式不返回任何值或產生乙個通用型別的指標 3 為什麼定義的變數有很多的型別 記憶體極其有限...

學習C 修飾符 類修飾符和成員修飾符

c 修飾符之類修飾符 public internal partial abstract sealed static c 修飾符之成員修飾符 public protected private internal sealed abstract virtual override readonly cons...