2012-03-12 46 views
7

Tôi đang gặp khó khăn trong việc hiểu cú pháp của các con trỏ hàm. Những gì tôi đang cố gắng làm là, có một mảng các con trỏ hàm, không có đối số và trả về một con trỏ void. có ai giúp được không?Mảng con trỏ hàm trong C

+5

Bạn sẽ nhận được phản hồi tốt hơn nếu bạn đăng một số mã mà bạn đã thử, ngay cả khi nó không hoạt động và giải thích tốt nhất bạn có thể giải quyết vấn đề. Nó thể hiện nhiều nỗ lực hơn từ phía bạn. –

+0

kiểm tra [link] này (http://c-faq.com/decl/spiral.anderson.html) – Vikram

Trả lời

16
  1. Trước hết, bạn nên tìm hiểu về cdecl:

    cdecl> declare a as array 10 of pointer to function(void) returning pointer to void 
    void *(*a[10])(void) 
    
  2. Bạn có thể làm điều đó bằng tay - chỉ cần xây dựng nó lên từ bên trong:

    a

    là một mảng:

    a[10]

    của con trỏ:

    *a[10]

    chức năng:

    (*a[10])

    dùng không có đối số:

    (*a[10])(void)

    lại quay void *:

    void *(*a[10])(void)

  3. Sẽ tốt hơn nhiều nếu bạn sử dụng typedef để làm cho cuộc sống của bạn dễ dàng hơn:

    typedef void *(*func)(void); 
    

    Và sau đó làm cho mảng của bạn:

    func a[10]; 
    
+0

Lưu ý: liên kết ngay từ đầu rất hữu ích! – Ziezi

2

Sử dụng typedef s

typedef void* func(void); 
func *arr[37]; 
7

Khi cú pháp phức hợp quá phức tạp, typedef thường xóa mọi thứ.

Ví dụ:

typedef void *(* funcPtr)(void); 

funcPtr array[100]; 

nào mà không có sự typedef Tôi đoán sẽ trông như thế:

void *(* array[100])(void); 
2

Bắt đầu với tên mảng và làm việc theo cách của bạn ra, nhớ rằng []() ràng buộc trước khi * (*a[] là một mảng của con trỏ, (*a)[] là một con trỏ đến một mảng, *f() là một hàm trả về một con trỏ, (*f)() là một con trỏ đến một hàm):

 farr    -- farr 
     farr[N]   -- is an N-element array 
     *farr[N]   -- of pointers 
     (*farr[N])( )  -- to functions 
     (*farr[N])(void)  -- taking no arguments 
    *(*farr[N])(void)  -- and returning pointers 
void *(*farr[N])(void); -- to void