2014-01-28 75 views
0

我學習C和我來到這個表達式:void *(* routine)(void *)在C中表示什麼?

void *(*routine)(void *) 

我覺得很困惑。也許它是一個指針...指向一個指針?

如果我想把這個東西傳遞給一個函數,我們將如何操作它?我試圖把這個例程結構作爲一個參數傳遞給一個需要void(*)(void)的函數......但是我對這個實際上意味着什麼卻不知所措。

+2

在類似情況下[HTTP ://cdecl.org/](http://cdecl.ridiculousfish.com/?q=void+*%28*routine%29%28void+*%29)是你的朋友。 – luk32

+0

cdecl.ridiculousfish.com/?q=void+*%28*routine%29%28void+*%29 –

+0

Wooow感謝cdecl! – PinkElephantsOnParade

回答

11
void *(*routine)(void *); 

聲明一個指針函數,它void *類型的參數,並返回型的指針void *


簡單的例子:

#include <stdio.h> 

void* foo(void* x) { 
    printf("Hello."); 
} 

int main(void) { 
    void *(*routine)(void *); 
    routine = foo;    // assings foo to our function pointer 
    (*routine)(NULL);   // invokes foo using this pointer 
    return 0; 
} 

輸出:Hello.


「如果我想這件事情傳進函數」〜我這裏是2對您:

#include <stdio.h> 

void* foo(void* x) { 
    printf("Hello."); 
} 

typedef void *(*RoutinePtr)(void *);   // alias to make your life easier 

void routineInvoker(RoutinePtr routine) { 
    (*routine)(NULL); // invokes the routine 
} 

int main(void) { 
    RoutinePtr routine = foo; // creates a function pointer 
    routineInvoker(routine); // and passes it to our invoker 
    return 0; 
} 
19

啓動最左邊的標識和工作的方式了,記住,沒有明確的分組帶括號, []和函數調用()綁定之前*,所以

  • *a[N]是指針的N元件陣列
  • (*a)[N]是一個指針到N元件陣列
  • *f()是返回指針
  • (*f)()的函數的指針的函數

所以,

 routine    -- routine 
     *routine    -- is a pointer 
     (*routine)( ) -- to a function 
     (*routine)(void *) -- taking a single parameter of type void * 
    *(*routine)(void *) -- returning a pointer 
void *(*routine)(void *) -- to void 
+1

+1有關如何閱讀聲明的清晰可愛的解釋:) – LihO

相關問題