右左法則是乙個既著名又常用的方法。不過,右左法則其實並不是c標準裡面的內容,它是從c標準的宣告規定中歸納出來的方法。c標準的宣告規則,是用來解決如何建立宣告的,而右左法則是用來解決如何辯識乙個宣告的。
右左法則:首先從最裡面的圓括號看起,然後往右看,再往左看。每當遇到圓括號時,就應該掉轉閱讀方向。一旦解析完圓括號裡面所有的東西,就跳出圓括號。重複這個過程直到整個宣告解析完畢。
筆者要對這個法則進行乙個小小的修正,應該是從未定義的識別符號開始閱讀,而不是從括號讀起,之所以是未定義的識別符號,是因為乙個宣告裡面可能有多個識別符號,但未定義的識別符號只會有乙個。
要理解比較複雜的指標型別宣告,在描述乙個指標時就要注意語言比較簡明。下面是我的一些規則。
描述乙個陣列時:int a[5] a是乙個且有5個元素的陣列,它的元素是int型變數
描述乙個函式指標時:int (*p)(int i) p是乙個函式指標,這類函式且有int型返回值,且有乙個int型引數
int (*func)(int *p);
。從func看起,向左到括號,向右為*,結果:func為乙個指標
。跳出括號,向右看,又是乙個括號。結果:func為乙個指標函式
。向左為int 結果:func為乙個函式指標,這類函式且有乙個int*型引數,且有乙個int型返回值。
int (*func)(int *p, int (*f)(int*));
。從func看起,向左到括號,向右為*,結果:func為乙個指標
。跳出括號,向右看,又是乙個括號。結果:func為乙個指標函式
。向左為int 結果:func為乙個函式指標,這類函式且有乙個int (*f)(int*)引數,且有乙個int型返回值。
。第二個引數較複雜,單獨來看,可以發現與上面的例子一樣。
int (*func[5])(int *p);
。從func看起,向左為[5],結果:func為乙個且有5個元素的陣列。
。向右為*,結果:陣列的元素為指標
。跳出括號,向右看,又是乙個括號。結果:陣列的元素是乙個指標陣列
。向左為int 結果:func是乙個且有5個元素的陣列,陣列的元素為乙個函式指標,這類函式且有int型返回值,且有乙個int*型引數。
說明:因為第一次向右看即為陣列,說明func是陣列,這裡已經固定func的型別,下面再說即是對陣列元素的描述
int (*(*func)[5])(int *p);
。從func看起,向左到括號,向右為*,結果:func為乙個指標
。跳出括號,向右看,是乙個[5],說明func是乙個陣列指標,指向乙個且有5個元素的陣列。
。向左看,是乙個*,說明陣列的元素是指標。
。跳出括號,向右看,是乙個括號,說明陣列的元素是函式指標
。向左為int 結果:func為乙個指向且有5個元素的陣列的指標,陣列的元素是乙個函式指標,這類函式且有int型返回值,且有乙個int*型參 數
說明:這裡從指標跳到陣列元素,再從陣列元素跳到函式指標,一層層的說明。更容易理清條理
int (*(*func)(int *p))[5];
。從func看起,向右為括號,向左為*,說明func是乙個指標
。跳出括號向右為乙個括號,說明func是乙個函式指標,這類函式且有int*型引數
。向左為乙個*,說明這類函式返回指為乙個指標
。向右為[5],說明這類函式返回值為陣列指標
。向左為乙個int,說明陣列且有5個int型元素
。func是乙個函式指標,這類函式且有乙個int*型引數。返回值為陣列指標,陣列裡有5個int型元素
說明:當確定為陣列後,馬上進入陣列元素的分析
當確定為函式指標後,馬上進入對函式的分析,函式型別、函式返回值
當確定為陣列指標後,馬上進入它所指向陣列的分析
實際應用中這樣宣告複雜的型別大大影響程式的可讀性。應該分解,比如:
int (*(*func)(int *p))[5];
可以分解為:
typedef int (*para)[5];
para (*func)(int *p);
複雜指標讀法
c inta 乙個整形 int a 乙個指標,批向乙個整形 整形指標 int a 乙個函式,反回乙個整形指標 int a 10 乙個陣列,裡面存放著整形指標 int a 乙個指標,指向乙個函式,該函式返回整形 int a 乙個指標,指向乙個陣列,陣列裡放著整形 int a 乙個整形 int a 乙個...
複雜指標解析
因為c語言所有複雜的指標宣告,都是由各種宣告巢狀構成的。如何解讀複雜指標宣告呢?右左法則是乙個既著名又常用的方法。不過,右左法則其實並不是c標準裡面的內容,它是從c標準的宣告規定中歸納出來的方法。c標準的宣告規則,是用來解決如何建立宣告的,而右左法則是用來解決如何辯識乙個宣告的,兩者可以說是相反的。...
複雜指標宣告
這是乙個簡單的法則,但能讓你準確理解所有的宣告。這個法則運用如下 從最內部的額括號開始閱讀宣告,向右看,然後向左看。當你碰到乙個括號時就調轉閱讀的方向。括號內的所有內容都分析完畢就跳出括號的範圍。這樣繼續,直到整個宣告都被宣告完畢。對上述右左法則做乙個小小的修正 當你在第一次開始閱讀宣告時,必須從變...