首先擺乙個問題: c/c++**裡的兩行
int ( * uof [3] ) [4];
int ( * flump [3] ) ( );
到底定義了個什麼東東???
if你很清楚,那麼你可以return 了,else 就跟著我一起看下去吧!
在使用c/c++程式設計的時候,經常會遇到指標和陣列,本來也沒什麼,可有時候兩者偏偏就搞到一塊,組合成指標陣列或者陣列指標之類的,這就有點讓人頭大,分不清啊!
就算今天分清楚了,下次再遇到的時候又忘了。今天在這裡專門總結下,以備不時之需。
首先要說明的是,c/c++ 允許我們在進行變數或函式宣告的時候新增乙個或者多個修飾符來修飾識別符號。
宣告時可以使用的修飾符
修飾符含義*
表示乙個指標
( )表示乙個函式
[ ]表示乙個陣列
c/c++允許同時使用多於1個修飾符,這就使得可以建立如下各種各樣的型別:
int board [8] [9]; // int 陣列的陣列
int ** ptr; // 指向 int 的指標的指標
int * risks [10]; // 具有10個元素的陣列,每個元素都是乙個指向 int 的指標
int ( * risks ) [10]; // 乙個指標,指向具有10個元素的int 陣列
int * oof [3] [4]; // 乙個3*4的陣列,每個元素都是乙個指向 int 的指標
int ( * uuf ) [3] [4]; // 乙個指標,指向 3*4的int 陣列
弄清楚這些宣告的訣竅在於理解使用修飾符的順序。下面這些規則會讓你對其有所了解:
1. 表示乙個陣列的 [ ] 和表示乙個函式的 ( ) 具有同樣的優先順序,這個優先順序高於間接運算子 * 的優先順序。這意味著下面的宣告使得 risks 是乙個指標陣列,而不是乙個指向陣列的指標。
int * risks [10];
2. [ ] 和 ( ) 都是從左到右進行結合的。下面的宣告使 goods 是乙個由12個具有50個int 值的陣列構成的陣列,而不是乙個由50個具有12個int值的陣列構成的陣列:
int goods[12][50];
3. [ ] 和 ( ) 具有相同的優先順序,但由於他們是從左到右結合的,所以下面的宣告在應用方括號之前先將 * 和 risks 組合在一起。這意味著risks 是乙個指向具有10個int 值的陣列的指標:
int ( * risks ) [10];
現在看下 int ( * uof [3] ) [4]; 知道含義了吧:乙個具有3個元素的陣列,每個元素是乙個指向具有4個元素的int 陣列的指標。
這些規則同樣產生下面的型別:
char * fump ( ); // 返回指向char 的指標的函式
char ( * frump ) ( ); // 指向返回型別為 char 的函式的指標
char ( * flump[ 3 ] ) ( ); //返回型別 為由3個指標組成的陣列,每個指標指向為char 的函式
到此估計大家都清除了吧,不過個人建議 像可讀性如此之差的**盡量不要寫,自己爽了,維護的人可頭大了。。
C C 中函式宣告的作用
參考 一直想不明白,函式宣告的作用。在include中我們只是把函式的宣告放入 了,呼叫函式的具體實現還是要看函式的定義,那麼include函式宣告到底有什麼作用呢?按理說我只要能正確鏈結對應的函式定義就可以了呀?在參考的部落格中看到這麼一段話 其實函式宣告的作用是讓編譯器幫你檢查你呼叫函式時有沒有...
C C 中的變數宣告解讀
複雜的 c c 宣告,你只需要使用一條規則 理解 c 語言宣告的優先順序 a 宣告從它的名字開始讀取,然後按照優先順序順序依次讀取.b 優先順序從高到低依次是 b.1 宣告中被括號括起來的那部分 b.2 字尾操作符 括號 表示這是乙個函式,而 方括號表示這是乙個陣列 b.3 字首操作符 星號 表示 ...
C C 中宣告與定義
今天在寫程式的時候遇到這樣乙個問題 我的工程分為 main.cpp paint.cpp file.cpp struct.h 最初的想法是在標頭檔案中把結構體和所有的資料定義出來,如果哪個cpp檔案用到了這些東西,直接加入該標頭檔案就好了,結果報錯 經過查資料,發現將資料定義在標頭檔案中,如果多個cp...