我很難理解下面的聲明是什麼意思。這個聲明是否爲標準?double *(* p [3])(void *(*)());意思?
double* (*p[3]) (void* (*)());
任何人都可以幫助我理解這個聲明的含義嗎?
我很難理解下面的聲明是什麼意思。這個聲明是否爲標準?double *(* p [3])(void *(*)());意思?
double* (*p[3]) (void* (*)());
任何人都可以幫助我理解這個聲明的含義嗎?
規則用於讀取多毛的聲明:找到最左邊的標識符和向外工作,記住()
和[]
*
之前綁定,所以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};
每個foo
,bar
和bletch
會調用該函數傳遞給它,不知何故返回一個指針double
。
你也想定義滿足參數類型爲每個foo
,bar
一個或多個功能,和bletch
:
void *blurga() {...}
所以如果你直接調用foo
,你會這樣稱呼它
double *pv;
...
pv = foo(blurga);
因此,我們可以想像這樣
double *pv = (*p[0])(blurga);
通話
T a[]
和T a[N]
與T *a
相同;在所有三種情況下,a
是指向T
的指針,而不是數組T
。請注意,這是只有在函數參數聲明中爲true。因此,T *[]
將與T **
相同。
非常感謝! – Nick
只需使用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];
(顯然,代替foo
和bar
使用適當的名字!)
你p
是陣列的3個指針一個函數返回一個double
指針,並將一個指針指向另一個返回void
指針並且不帶參數的函數。
但是,不使用此語法,請嘗試使用typedef代替。
+1,因爲對我來說這是最明確的描述 – Nick
我也是,但我喜歡Oli的鏈接「諺語教我魚」:) –
它是函數指針的數組(大小爲3),它返回指向double的指針並將另一個函數指針作爲參數。
類型的函數,它的指針可以被存儲在數組中:double *(func)(void* (*)())
,其指針可以作爲參數被傳遞給FUNC類型功能:void *(func1)(void)
+1因爲這是最容易理解的描述(對我而言)。 – ArjunShankar
「有一種被稱爲」順時針/螺旋法則「的技術,它可以讓任何C程序員在他們的腦海中解析任何C聲明!」
我很高興地走在Java世界......而不是在C世界運行 –
...? ;-) –
Oli Charlesworth提供了一個非常有用的答案。不要關閉。 – DevSolar