複雜指標判別

2021-04-12 12:26:50 字數 1980 閱讀 4230

右左法則是乙個既著名又常用的方法。不過,右左法則其實並不是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標準的宣告規則,是用來解決如何建立宣告的,而右左法則是用來解決如何辯識乙個宣告的,兩者可以說是相反的。...

複雜指標宣告

這是乙個簡單的法則,但能讓你準確理解所有的宣告。這個法則運用如下 從最內部的額括號開始閱讀宣告,向右看,然後向左看。當你碰到乙個括號時就調轉閱讀的方向。括號內的所有內容都分析完畢就跳出括號的範圍。這樣繼續,直到整個宣告都被宣告完畢。對上述右左法則做乙個小小的修正 當你在第一次開始閱讀宣告時,必須從變...