2011-02-23 27 views
31

Diziler şöyle oluşturulabilir: Ayrı bir yazım hatası kullanmadan bir işlev işaretçisi dizisini bildiren sözdizimi nedir? işlev işaretçileri

typedef void(*FunctionPointer)(); 
FunctionPointer functionPointers[] = {/* Stuff here */}; 

typedef kullanmadan bir fonksiyon işaretçisi dizisi oluşturmak için sözdizimi nedir

?

+7

İlginç bir soru, ama "gerçek" kod sadece işlev işaretçileri altın kuralı takip etmelidir: typedef' aksi kimse kolay anlama mümkün olacak 'kullanmak . ':) –

cevap

62
arr //arr 
arr [] //is an array (so index it) 
* arr [] //of pointers (so dereference them) 
(* arr [])() //to functions taking nothing (so call them with()) 
void (* arr [])() //returning void 

böylece cevap

void (* arr [])() = {}; 

olduğu Ama doğal, bu, sadece typedefs :)

Ekstra kullanmak kötü bir uygulamadır: nasıl bir diziyi bildirmek için Wonder Int almak ve ikincisi ve dönen char alma işlevlerine 4 işaretçi bir dizi için bir işaretçi döndüren işlevlere 3 işaretçiler?

arr //arr 
arr [3] //is an array of 3 (index it) 
* arr [3] //pointers 
(* arr [3])(int) //to functions taking int (call it) and 
*(* arr [3])(int) //returning a pointer (dereference it) 
(*(* arr [3])(int))[4] //to an array of 4 
*(*(* arr [3])(int))[4] //pointers 
(*(*(* arr [3])(int))[4])(double) //to functions taking double and 
char (*(*(* arr [3])(int))[4])(double) //returning char 

:))

+15

+1, ama bu tür bir mazoşizm için cdecl.org var. ':)' –

+6

Oh Tanrım gözlerim. @ _ @ – Maxpm

+0

Teşekkür ederim Matteo; cdecl.org harika bir site! –

2

bunu kullanın: her şey gibi

void (*FunctionPointers[])() = { }; 

İşleri, sen adından sonra [] yerleştirin.

10

hatırla (yani, ha? :) ne kadar soğuk) "delcaration taklit kullanmak". Yani, belirtilen diziyi kullanmak için

Doğru? Bu nedenle aynı kullanmak, beyan etmek:

void (*FunctionPointers[])() = { ... }; 
İlgili konular