在看別人程式火寫程式之肯定會先宣告變數那如何正確的去看這些宣告,首先需要知道「右左法則」這在理解複雜宣告時很重要。
在使用「右左法則」時先確定變數的位置。先向變數的右邊讀再向左邊讀。
先從簡單開始:
int a;整型變數
int *a;
整型指標變數
int **a;
整型指標的指標變數
int *a[10]; 整形指標陣列
int (*a)[10]
; 整型陣列指標變數
int (*a)(int);
函式指標變數
int (*a[10])(int) 函式指標陣列
這個法則,能讓你準確理解所有的宣告。這個法則運用如下:從最內部的括號開始閱讀宣告,向右看,然後向左看。當你碰到乙個括號時就調轉閱讀的方向。括號內的所有內容都分析完畢就跳出括號的範圍。這樣繼續,直到整個宣告都被分析完畢。
對複雜宣告也同樣適用,如下:
int * (* (*fp1) (int) ) [10];
fp1:函式指標變數,指向乙個形參
int,返回值為陣列指標,該指標指向乙個整型指標陣列;
1. 從變數名開始
-------------------------------------------- fp1
2. 往右看,什麼也沒有,碰到了
),因此往左看,碰到乙個
* ------
乙個指標
3. 跳出括號,碰到了
(int) -----------------------------------
乙個帶乙個
int引數的函式
4. 向左看,發現乙個
* ---------------------------------------
(函式)返回乙個指標
5. 跳出括號,向右看,碰到
[10] ------------------------------
乙個10
元素的陣列
6. 向左看,發現乙個
* ---------------------------------------
指標
7. 向左看,發現
int ----------------------------------------- int
型別
總結:fp1被宣告成為乙個函式的指標
,該函式返回指向指標陣列的指標.
float ( * ( * e[10]) (int *) ) [5];
e是乙個函式指標陣列,該陣列的元素指向乙個形參為
int *
,返回值為陣列指標,該指標指向
float
型的陣列;
float ( * ( *b()) )();
b是乙個函式,該函式形參為空,返回值為陣列指標,該陣列指標指向乙個函式指標陣列,陣列裡的元素指向乙個形參為空,返回值為
float
;
C 複雜宣告理解
理解複雜宣告可用的 右左法則 從變數名看起,先往右,再往左,碰到乙個圓括號就調轉閱讀的方向 括號內分析完就跳出括號,還是按先右後左的順序,如此迴圈,直到整個宣告分析完。舉例 int func int p 首先找到變數名func,外面有一對圓括號,而且左邊是乙個 號,這說明func是乙個指標 然後跳出...
C 語言複雜宣告的理解
c語言常常因為宣告的語法問題而受到人們的批評,特別是涉及到函式指標的語法。c語言的語法力圖使宣告和使用相一致。對於簡單的情況,c語言的做法是很有效的,但是,如果情況比較複雜,則容易讓人混淆,原因在於,c語言的宣告不能從左至右閱讀,而且使用了太多的圓括號.但是找到正確的規則去理解,無論多複雜都可以搞清...
如何理解c和c 的複雜型別宣告
首先,讓我們看看指標與const結合的宣告 const int p p是指向常整形的指標 int const p 錯誤 int const p p是指向整形的常指標 const int const p p是指向常整形的常指標 怎麼樣?希望大家不會搞混吧,下面我會告訴大家如何去理解,但是寫到這裡,我突...