複雜指標和右左法則

2021-05-23 23:59:16 字數 2168 閱讀 8545

複雜指標的宣告

用變數a給出下面的定義: 

定義乙個整型數。

定義乙個指向整型數的指標。

定義乙個指向指標的指標,它指向的指標是乙個指向整型數指標。

定義乙個有10個整型數的陣列。

定義乙個有10個指標的陣列,該指標是指向乙個整型數的指標。

定義乙個指向有10個整型數陣列的指標。

定義乙個指向函式的指標,該函式有乙個整型引數並返回乙個整型數。

定義乙個有10個指標的陣列,該指標指向乙個函式,該函式有乙個整型引數並返回乙個整型數。

答案:int a;

int *a;

int **a;

int a[10];

int *a[10];

int (*a)[10];

int (*a)(int);

int (*a[10])(int);

右左法則

首先從最裡面的圓括號看起,然後往右看,再往左看。每當遇到圓括號時,就應該掉轉閱讀方向。一旦解析完圓括號裡面所有的東西,就跳出圓括號。重複這個過程直到整個宣告解析完畢。 

這裡對這個法則進行乙個小小的修正,應該是從未定義的識別符號開始閱讀,而不是從括號讀起,之所以是未定義的識別符號,是因為乙個宣告裡面可能有多個識別符號,但未定義的識別符號只會有乙個。 

現在通過一些例子來討論右左法則的應用,先從最簡單的開始,逐步加深:

int (*func)(

int *p); 

首先找到那個未定義的識別符號,就是func,它的外面有一對圓括號,而且左邊是乙個*號,這說明func是乙個指標,然後跳出這個圓括號,先看右邊,也是乙個圓括號,這說明(*func)是乙個函式,而func是乙個指向這類函式的指標,就是乙個函式指標,這類函式具有int*型別的形參,返回值型別是int。

int (*func)(

int *p, 

int (*f)(

int*)); 

func被一對括號包含,且左邊有乙個 *號,說明func是乙個指標,跳出括號,右邊也有個括號,那麼func是乙個指向函式的指標,這類函式具有int *和int (*)(int*)這樣的形參,返回值為int型別。再來看一看func的形參int (*f)(int*),類似前面的解釋,f也是乙個函式指標,指向的函式具有int*型別的形參,返回值為int。

int (*func[

5])(

int *p); 

func 右邊是乙個運算子,說明func是乙個具有5個元素的陣列,func的左邊有乙個*,說明func的元素是指標,要注意這裡的*不是修飾func的,而是修飾func[5]的,原因是運算子優先順序比*高,func先跟結合,因此*修飾的是func[5]。跳出這個括號,看右邊,也是一對圓括號,說明func陣列的元素是函式型別的指標,它所指向的函式具有int*型別的形參,返回值型別為int。

int (*(*func)[

5])(

int *p); 

func 被乙個圓括號包含,左邊又有乙個*,那麼func是乙個指標,跳出括號,右邊是乙個運算符號,說明func是乙個指向陣列的指標,現在往左看,左邊有乙個*號,說明這個陣列的元素是指標,再跳出括號,右邊又有乙個括號,說明這個陣列的元素是指向函式的指標。總結一下,就是:func是乙個指向陣列的指標,這個陣列的元素是函式指標,這些指標指向具有int*形參,返回值為int型別的函式。

int (*(*func)(

int *p))[

5]; 

func是乙個函式指標,這類函式具有int*型別的形參,返回值是指向陣列的指標,所指向的陣列的元素是具有5個int元素的陣列。

要注意有些複雜指標宣告是非法的,例如:

int func(

void) [

5]; 

func是乙個返回值為具有5個int元素的陣列的函式。但c語言的函式返回值不能為陣列,這是因為如果允許函式返回值為陣列,那麼接收這個陣列的內容的東西,也必須是乙個陣列,但c語言的陣列名是乙個右值,它不能作為左值來接收另乙個陣列,因此函式返回值不能為陣列。

int func[

5](void); 

func是乙個具有5個元素的陣列,這個陣列的元素都是函式。這也是非法的,因為陣列的元素除了型別必須一樣外,每個元素所占用的記憶體空間也必須相同,顯然函式是無法達到這個要求的,即使函式的型別一樣,但函式所占用的空間通常是不相同的。

以上內容摘自:《c/c++程式設計師生存手冊》

右左法則 複雜指標解析

第八章 右左法則 複雜指標解析 上一章費那麼多唇舌討論c語言的宣告,其實目的都是為了這一章,期望讀者通過對c語言宣告形式的詳細了解,樹立宣告巢狀的觀念,因為c語言所有複雜的指標宣告,都是由各種宣告巢狀構成的。如何解讀複雜指標宣告呢?右左法則是乙個既著名又常用的方法。不過,右左法則其實並不是c標準裡面...

右左法則 複雜指標解析

因為c語言所有複雜的指標宣告,都是由各種宣告巢狀構成的。如何解讀複雜指標宣告呢?右左法則是乙個既著名又常用的方法。不過,右左法 則其實並不是c標準裡面的內容,它是從c標準的宣告規定中歸納出來的方法。c標準的宣告規則,是用來解決如何建立宣告的,而右左法則是用 來解決如何辯識乙個宣告的,兩者可以說是相反...

右左法則 複雜指標解析

因為c語言所有複雜的指標宣告,都是由各種宣告巢狀構成的。如何解讀複雜指標宣告呢?右左法則是乙個既著名又常用的方法。不過,右左法則其實並不是c標準裡面的內容,它是從c標準的宣告規定中歸納出來的方法。c標準的宣告規則,是用來解決如何建立宣告的,而右左法則是用來解決如何辯識乙個宣告的,兩者可以說是相反的。...