C C 中的變數宣告解讀

2022-02-01 00:10:29 字數 1492 閱讀 8590

複雜的 c/c++ 宣告, 你只需要使用一條規則:

理解 c 語言宣告的優先順序:

a  宣告從它的名字開始讀取, 然後按照優先順序順序依次讀取. 

b  優先順序從高到低依次是:

b. 1  宣告中被括號括起來的那部分

b. 2  字尾操作符:

括號 () 表示這是乙個函式, 而

方括號表示這是乙個陣列

b. 3  字首操作符: 星號 * 表示 "指向 ... 的指標". 

c  如果 const 和 (或) volatile 關鍵字的後面緊跟型別說明符 (如 int, long 等), 那麼它作用 於型別說明符. 在其他情況下, const 和 (或) volatile 關鍵字作用於它左邊緊鄰的指標星號. 

char

*const*(

*next)() ;

//next 是乙個指標, 這個指標指向乙個無參的函式, 這個函式返回乙個常指標, 這個常指標指向另乙個 char *.

b. 2 和 b. 3 必會交替執行, 因為 c/c++ 中不能出現 var() 或 var() 或 var()(), 因此分析完乙個識別符號後的 ( 或 [ 時, 都會轉向左邊去尋找星號 *, 只有一種情況特例, 就是多維陣列, 如: int *arr[10][10] ; 這種情況需要在識別符號後面一直尋找中括號, 直到找完為止. 詳情參見 c 語言語法所不能

對於上述 c 條件, 我個人有些補充:

如果 const 或 volatile 緊鄰型別說明符, 則其修飾的就是型別說明符. 否則, const 緊鄰星號 *, 則其修飾的是指標本身.

總結來說, 就是const 是左結合的, 僅當 const 左邊沒有可修飾的符號時才進行右結合. 因為要考慮到如下情況:

int

const

*p ;

//此時在型別說明符 (int) 在 const 的前面, 所以是 (int const) *p, 即常指標. 等同於 int const *p ;

說的直白一些就是先找到識別符號, 然後往右看, 直到看到 ')' 為止, 然後向左走, 跳過已讀過的符號, 直到看到前面開括號對應的 '(' 為止. 我一直是這麼做的. 例如:

10  9   8   7 3  1   2    6    5   4

char

*const*(

*next[10])(int const x) ;

next 是乙個識別符號

這個識別符號是乙個是個元素的陣列

這個陣列存放的是指標, 這些指標指向函式

所指向的函式含有乙個引數 x

這個引數是常量變數

這個引數型別是 int 型

這個函式返回乙個指標

這個指標指向另乙個指標

被指向的指標是指標常量

這個指標常量指向乙個 char 型變數

c c 中變數的宣告和定義

不管是函式還是變數的宣告,都是為了告訴編譯器我要使用這個變數或者函式了,用於型別檢查。在定義的時候編譯器是不會分配任何記憶體的,比如下面的函式 void func 當函式執行到int a 的時候,這是乙個宣告,編譯器不會為其分配記憶體空間。當執行到a 0 這是乙個定義,編譯器才會為其分配記憶體空間。...

C C 中變數(區域性變數)的宣告和範圍

全域性變數往往在main函式中宣告,其作用範圍為整個 區域性變數存在於宣告該變數的塊語句或方法結束的右花括號 之前的作用域內。本文對c 中的一些變數宣告和範圍關係借幾個demo展示出來。情況一 變數包含產生歧義 根據變數的作用域遵循的原則 區域性變數存在於宣告該變數的塊語句或方法結束的右花括號 之前...

c c 變數定義與宣告

我們在程式設計中,時時刻刻都用到變數的定義和變數的宣告,可有些時候我們對這個概念不是很清楚,知道它是怎麼用,但卻不知是怎麼一會事,下面我就簡單的把他們的區別介紹如下 望我的指點對你受益 變數的宣告有兩種情況 1 一種是需要建立儲存空間的。例如 int a 在宣告的時候就已經建立了儲存空間。2 另一種...