Saya telah menemukan dua deklarasi pointer yang saya mengalami kesulitan memahami. Pemahaman saya tentang aturan diutamakan berjalan seperti ini:
Operator Precedence Associativity
(), [ ] 1 Left to Right
*, identifier 2 Right to Left
Data type 3
Tetapi meskipun diberi ini, saya sepertinya tidak tahu cara mengevaluasi contoh-contoh berikut dengan benar:
Contoh pertama
float * (* (*ptr)(int))(double **,char c)
Evaluasi saya:
*(ptr)
(int)
*(*ptr)(int)
*(*(*ptr)(int))
Kemudian,
double **
char c
Contoh kedua
unsigned **( * (*ptr) [5] ) (char const *,int *)
*(ptr)
[5]
*(*ptr)[5]
*(*(*ptr)[5])
**(*(*ptr)[5])
Bagaimana saya harus membacanya?
Jawaban:
Dugaan saya untuk yang pertama : ptr adalah pointer ke fungsi yang mengambil sebagai parameter int, dan mengembalikan pointer ke fungsi yang mengambil sebagai parameter pointer ke pointer untuk menggandakan dan char, dan mengembalikan pointer ke float.
Interpretasi :
(* ptr) (int)
mengatakan bahwa ptr adalah penunjuk ke fungsi yang mengambil int sebagai argumen. Untuk menemukan fungsi yang dikembalikan, kita perlu memperluas tampilan:
(* (* ptr) (int))
ini berarti fungsi mengembalikan pointer ke fungsi lain. Parameter dari fungsi lainnya adalah:
(dobel **, char c)
dan itu kembali
mengapung *
Dan untuk yang kedua : ptr adalah pointer ke array lima pointer ke fungsi yang mengambil parameter pointer konstan ke char dan pointer ke int, mengembalikan pointer ke pointer dari unsigned int.
Interpretasi :
(* (* ptr) [5])
mendeklarasikan ptr sebagai pointer ke array lima pointer ke pengambilan fungsi
(char const *, int *)
sebagai argumen dan kembali
tidak ditandatangani **
sumber
Anda bisa mencoba Metode 'The Clockwise Spiral' untuk memahami deklarasi gila ini:
http://c-faq.com/decl/spiral.anderson.html
Saya juga menulis blog di sini:
http://www.kalekold.net/index.php?post=4
sumber
Ini adalah pointer fungsi. Orang yang menulisnya bisa menggunakan typedef dengan lebih baik untuk membuatnya lebih jelas.
Ini berlaku pointer berfungsi dengan parameter ini. float * myfunc (ganda **, char)
sumber
Menggunakan cdecl.org:
mendeklarasikan bar sebagai const pointer ke array 5 dari pointer ke function (int) mengembalikan const pointer ke char
mendeklarasikan ptr sebagai pointer ke array 5 dari pointer berfungsi (pointer ke const char, pointer ke int) mengembalikan pointer ke pointer ke unsigned
sumber