Làm thế nào được ưu tiên xác định trong con trỏ C?


14

Tôi đã đi qua hai khai báo con trỏ mà tôi gặp khó khăn để hiểu. Sự hiểu biết của tôi về các quy tắc ưu tiên diễn ra như thế này:

Operator             Precedence             Associativity
(), [ ]                  1                  Left to Right
*, identifier            2                  Right to Left
Data type                3

Nhưng ngay cả khi đưa ra điều này, tôi dường như không thể tìm ra cách đánh giá các ví dụ sau một cách chính xác:

Ví dụ đầu tiên

float * (* (*ptr)(int))(double **,char c)

Đánh giá của tôi:

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

Sau đó,

  1. double **
  2. char c

Ví dụ thứ hai

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

Tôi nên đọc chúng như thế nào?


1
Hỏi về cách một ngôn ngữ xử lý các tính năng của nó là chủ đề ở đây.

Câu trả lời:


7

Tôi đoán cho cái đầu tiên : ptr là một con trỏ tới một hàm lấy tham số int và trả về một con trỏ tới một hàm lấy tham số là một con trỏ để con trỏ thành double và char và trả về một con trỏ để float.

Dịch nghĩa :

(* ptr) (int)

nói rằng ptr là một con trỏ tới một hàm lấy int làm đối số. Để khám phá những gì chức năng đó trả về, chúng ta cần mở rộng quan điểm của mình:

(* (* ptr) (int))

điều này có nghĩa là hàm trả về một con trỏ đến hàm khác. Các tham số của chức năng khác là:

(gấp đôi **, char c)

và nó trở lại

Phao nổi *

Và đối với cái thứ hai : ptr là một con trỏ tới một mảng gồm năm con trỏ tới các hàm lấy tham số là một con trỏ không đổi thành char và một con trỏ tới int, trả về một con trỏ tới một con trỏ của int không dấu.

Dịch nghĩa :

(* (* ptr) [5])

khai báo ptr như một con trỏ tới mảng năm con trỏ tới một hàm

(char const *, int *)

làm đối số và trở về

chưa ký **


7

Bạn có thể thử Phương pháp 'Vòng xoắn ốc theo chiều kim đồng hồ' để hiểu những tuyên bố điên rồ này:

http://c-faq.com/decl/spirus.anderson.html

Tôi viết blog về nó ở đây quá:

http://www.kalekold.net/index.php?post=4


Cảm ơn bạn đã trả lời. Nhưng trong phương pháp The Clockwise xoắn ốc bắt đầu từ đâu trong trường hợp của tôi? Trong các ví dụ đưa ra trên liên kết có các ví dụ đơn giản. Tôi không thể kết hợp phương trình của tôi với phương pháp đó.
trapaank

1
bạn nên bắt đầu từ định danh của bạn: ptr. bạn sẽ có: "ptr là một con trỏ tới một hàm lấy một số nguyên và trả về một con trỏ tới một hàm đưa một con trỏ tới một con trỏ thành một đôi và một char và trả về một con trỏ cho một dấu phẩy". Hãy thử gián điệp và bạn sẽ nhận được cùng.
Remo.D

1

Đó là một con trỏ hàm. Người viết nó có thể đã sử dụng typedefs tốt hơn để làm cho nó rõ ràng hơn.

Đó là một con trỏ để hoạt động với các tham số này. float * myfunc (đôi **, char)


4
Đặt cược của tôi là người viết nó là giáo viên.
mouviciel

Hãy hy vọng đó không phải là giáo viên, bởi vì bạn không cần phải biết tào lao như thế này. Mặc dù tôi cho rằng một giáo viên giỏi trước tiên sẽ tát vào mặt bạn bằng những biểu cảm như thế này, để bạn gãi đầu cố gắng diễn giải chúng, sau đó chỉ cho bạn cách sử dụng typedef đúng cách.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.