2011年2月21日 星期一

char *(*(**foo[][8])())[] ???

對於底下的宣告,我們很容易就能夠辨認。

int i;

一個int變數i。

char *p;

一個指向char的變數p,也就是一個char指標。

那麼,底下這個宣告呢?

double **d[8];

比較難點了,不過要辨識還不致於太困難。這是一個有8個元素的double的指標的指標的陣列(開始...了)。

那麼,底下這個呢?

char *(*(**foo[][8])())[];

絶大部份的人看到這樣子的宣告,肯定會嚇一大跳,心裡面想說:靠,這是什麼鬼東西!

;

要理解這樣的宣告,可以遵循底下的三條規則:
  1. 從變數的名稱開始看。
  2. 到變數的類型作結束(如上的int,char)。
  3. 先盡量往右看,直到有需要時再往左看(如遇到括號)。
如下所示是分解動作。

ExpressionMeaning
char *(*(**foo [][8])())[]
char *(*(**foo [][8])())[]foo is … char
char *(*(**foo [][8])())[]foo is an array of … char
char *(*(**foo [][8])())[]foo is an array of an array of 8 … char
char *(*(**foo [][8])())[]foo is an array of an array of 8 pointer to … char
char *(*(**foo [][8])())[]foo is an array of an array of 8 pointer to pointer to … char
char *(*(**foo [][8])())[]foo is an array of an array of 8 pointer to pointer to function returning … char
char *(*(**foo [][8])())[]foo is an array of an array of 8 pointer to pointer to function returning pointer to … char
char *(*(**foo [][8])())[]foo is an array of an array of 8 pointer to pointer to function returning pointer to array of … char
char *(*(**foo [][8])())[]foo is an array of an array of 8 pointer to pointer to function returning pointer to array of pointer to char

;

參考 : http://www.unixwiz.net/techtips/reading-cdecl.html

不過話說回來,我自己是不可能會在程式裡面用上這種自己都搞不大清楚的東西。

1 則留言:

  1. simple is power

    而且寫成這樣跟自己過不去

    回覆刪除

Related Posts Plugin for WordPress, Blogger...