2012-06-06 105 views
8

我很難理解下面的聲明是什麼意思。這個聲明是否爲標準?double *(* p [3])(void *(*)());意思?

double* (*p[3]) (void* (*)()); 

任何人都可以幫助我理解這個聲明的含義嗎?

+1

我很高興地走在Java世界......而不是在C世界運行 –

+7

...? ;-) –

+0

Oli Charlesworth提供了一個非常有用的答案。不要關閉。 – DevSolar

回答

9

規則用於讀取多毛的聲明:找到最左邊的標識符和向外工作,記住()[]*之前綁定,所以T *a[N]是一個指針到T陣列,T (*a)[N]是指向的T陣列,T *f()是返回指針到T的功能,並且T (*f)()是指向返回T的函數的指針。由於函數原型可能會省略參數名稱,因此您可能會看到諸如T *[N]T (*)()之類的內容。意思是大致相同,只是假裝有一個0長度的標​​識符。

因此,

  p      -- p 
      p[3]     -- is a 3-element array 
     *p[3]     -- of pointers 
     (*p[3]) (   ) -- to functions 
     (*p[3]) (  (*)()) -- taking a pointer to a function 
     (*p[3]) ( * (*)()) -- returning a pointer 
     (*p[3]) (void* (*)()) -- to void 
     * (*p[3]) (void* (*)()) -- returning a pointer 
double* (*p[3]) (void* (*)()); -- to double 

這裏帶走重要的是,你聲明p作爲陣列的...,不是一個簡單的返回...

這樣的野獸在實踐中會是什麼樣子?那麼,首先,你需要三個功能指向。這些函數只有一個參數,它是一個指針函數返回一個指針到void:中

double *foo(void *(*)()); 
double *bar(void *(*)()); 
double *bletch(void *(*)()); 

double *(*p[3]) (void *(*)()) = {foo, bar, bletch}; 

每個foobarbletch會調用該函數傳遞給它,不知何故返回一個指針double

你也想定義滿足參數類型爲每個foobar一個或多個功能,和bletch

void *blurga() {...} 

所以如果你直接調用foo,你會這樣稱呼它

double *pv; 
... 
pv = foo(blurga); 

因此,我們可以想像這樣

double *pv = (*p[0])(blurga); 
通話


1-不同之處在於在函數參數聲明的上下文中,T a[]T a[N]T *a相同;在所有三種情況下,a是指向T的指針,而不是數組T。請注意,這是只有在函數參數聲明中爲true。因此,T *[]將與T **相同。

+0

非常感謝! – Nick

10

只需使用http://cdecl.org

聲明數p作爲指針的陣列3到函數(函數指針返回指向void)返回指針加倍

有關詳情,請參閱本MSDN文章:Interpreting more complex declarators

但類型定義,將有助於:

typedef void *(*foo)();   // foo is a function-pointer type 
typedef double *(*bar)(foo); // bar is also a function-pointer type 
bar p[3]; 

(顯然,代替foobar使用適當的名字!)

+2

我從來沒有見過那個網站+1 –

+0

請注意,您也可以將'cdecl'作爲命令行工具。 –

+1

+1用於連接你的智慧源,而不是讓它看起來像你自己變出它。 ;-) – DevSolar

2

p陣列的3個指針一個函數返回一個double指針,並將一個指針指向另一個返回void指針並且不帶參數的函數。

但是,不使用此語法,請嘗試使用typedef代替。

+0

+1,因爲對我來說這是最明確的描述 – Nick

+0

我也是,但我喜歡Oli的鏈接「諺語教我魚」:) –

1

它是函數指針的數組(大小爲3),它返回指向double的指針並將另一個函數指針作爲參數。

類型的函數,它的指針可以被存儲在數組中:double *(func)(void* (*)())
,其指針可以作爲參數被傳遞給FUNC類型功能:void *(func1)(void)

+0

+1因爲這是最容易理解的描述(對我而言)。 – ArjunShankar

相關問題