Bir işlev işaretçisi tanımlama
Bağımsız değişkeni ve dönüş değeri olmayan bir işleve bir işaretçiyi tanımlamak için şunu söylersiniz:
void (*funcPtr)();
Bunun gibi karmaşık bir tanıma baktığınızda, ona saldırmanın en iyi yolu ortadan başlamak ve çıkış yapmaktır.“Ortadan başlamak” funcPtr olan değişken adından başlamak anlamına gelir. “Çıkış yolunda çalışmak”, en yakın öğenin sağına bakmak (bu durumda hiçbir şey; sağ parantez sizi kısa durdurur), daha sonra sola (yıldız işaretiyle gösterilen bir işaretçi) bakmak, sonra sağa (bir argüman almayan bir fonksiyonu gösteren boş argüman listesi), sonra sola bakıldığında (fonksiyonun dönüş değeri olmadığını gösteren void). Bu sağ-sol-sağ hareket çoğu bildirimle çalışır.
“Ortadan başla” (“funcPtr bir ...”) incelemek için sağa gidin (orada hiçbir şey - sağ parantez tarafından durduruldunuz), sola gidin ve '*' (“ ... işaretçi bir ... ”), sağa gidin ve boş bağımsız değişken listesini (“ ... bağımsız değişken almayan işlev ... ”) bulun, sola gidin ve boşluğu bulun (“ funcPtr is argüman almayan ve void döndüren bir işleve işaretçi ”).
* FuncPtr'in neden parantez gerektirdiğini merak edebilirsiniz. Bunları kullanmadıysanız, derleyici şunu görür:
void *funcPtr();
Bir değişkeni tanımlamak yerine bir işlevi (void * döndüren) bildiriyor olursunuz. Derleyiciyi, bir bildirimin veya tanımın ne olması gerektiğini anladığında yaptığınız aynı işlemden geçtiğini düşünebilirsiniz. Bu parantezlerin “karşısına çıkması” gerekir, bu nedenle sola dönüp sağa devam etmek ve boş argüman listesini bulmak yerine '*' karakterini bulur.
Karmaşık bildirimler ve tanımlar
Bir yana, C ve C ++ bildirimi sözdiziminin nasıl çalıştığını anladıktan sonra çok daha karmaşık öğeler oluşturabilirsiniz. Örneğin:
//: C03:ComplicatedDefinitions.cpp
/* 1. */ void * (*(*fp1)(int))[10];
/* 2. */ float (*(*fp2)(int,int,float))(int);
/* 3. */ typedef double (*(*(*fp3)())[10])();
fp3 a;
/* 4. */ int (*(*f4())[10])();
int main() {} ///:~
Her birini gözden geçirin ve çözmek için sağ-sol kılavuzu kullanın. 1 numaralı “fp1, bir tamsayı bağımsız değişkeni alan ve 10 geçersiz işaretçi dizisine bir işaretçi döndüren bir işleve bir işaretçi” diyor.
Sayı 2 , “fp2 üç bağımsız değişken (int, int ve float) alan ve tamsayı bağımsız değişken alan ve kayan nokta döndüren bir işleve bir işaretçi döndüren bir işaretçi” diyor.
Çok sayıda karmaşık tanım oluşturuyorsanız, typedef kullanmak isteyebilirsiniz. Sayı 3 , bir typedef'in karmaşık açıklamayı yazmaya her seferinde nasıl tasarruf ettiğini gösterir. “Bir fp3, hiçbir argüman almayan ve hiçbir argüman almayan ve iki katına dönen işlevlere 10 işaretli bir diziye bir işaretçi döndüren bir işlevin işaretçisidir.” Sonra “a bu fp3 tiplerinden biridir” diyor. typedef genellikle basit olanlardan karmaşık açıklamalar oluşturmak için kullanışlıdır.
Sayı 4 , değişken tanımı yerine bir işlev bildirimidir. “F4, tamsayılar döndüren işlevlere 10 işaretli bir diziye bir işaretçi döndüren bir işlevdir” diyor.
Bunlar gibi karmaşık bildirimlere ve tanımlara ihtiyaç duymanız nadiren gerekecektir. Ancak, bunları çözme egzersizinden geçerseniz, gerçek hayatta karşılaşabileceğiniz biraz karmaşık olanlardan hafif bir şekilde rahatsız olmazsınız.