C++複雜聲明

來源:互聯網
上載者:User

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

        筆者要對這個法則進行一個小小的修正,應該是從未定義的標識符開始閱讀,而不是從括弧讀起,之所以是未定義的標識符,是因為一個聲明裡面可能有多個標識符,但未定義的標識符只會有一個。

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

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個元素的數組,這個數組的元素都是函數。這也是非法的,因為數組的元素除了類型必須一樣外,每個元素所佔用的記憶體空間也必須相同,顯然函數是無法達到這個要求的,即使函數的類型一樣,但函數所佔用的空間通常是不相同的。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.