Bagaimana presedensi ditentukan dalam pointer C?

14

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:

  1. *(ptr)
  2. (int)
  3. *(*ptr)(int)
  4. *(*(*ptr)(int))

Kemudian,

  1. double **
  2. char c

Contoh kedua

unsigned **( * (*ptr) [5] ) (char const *,int *)
  1. *(ptr)
  2. [5]
  3. *(*ptr)[5]
  4. *(*(*ptr)[5])
  5. **(*(*ptr)[5])

Bagaimana saya harus membacanya?

perangkap
sumber
1
Bertanya tentang bagaimana bahasa menangani fitur-fiturnya ada di topik di sini.

Jawaban:

7

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 **

Daniel Scocco
sumber
7

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

Gary Willoughby
sumber
Terima kasih atas balasannya Tetapi dalam metode The Clockwise Spiral dari mana untuk memulai dalam kasus saya? Dalam contoh yang diberikan pada tautan ada contoh sederhana. Saya tidak dapat mencocokkan persamaan saya dengan metode itu.
trapaank
1
Anda harus mulai dari pengenal Anda: ptr. Anda akan memiliki: "ptr adalah penunjuk ke fungsi yang mengambil int dan mengembalikan penunjuk ke fungsi yang membawa penunjuk ke penunjuk ke dobel dan char dan mengembalikan penunjuk ke pelampung". coba spyral dan Anda akan mendapatkan yang sama.
Remo.D
1

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)

Michael Shaw
sumber
4
Taruhan saya adalah orang yang menulisnya adalah guru.
mouviciel
Mari berharap itu bukan gurunya, karena Anda tidak perlu tahu omong kosong seperti ini. Meskipun saya kira seorang guru yang baik pertama-tama akan menampar wajah Anda dengan ekspresi seperti ini, membiarkan Anda menggaruk-garuk kepala mencoba menafsirkannya, kemudian menunjukkan kepada Anda bagaimana menggunakan typedef dengan benar.