2013-03-07 27 views
8

Tôi hơi bối rối về cú pháp chính xác để gán con trỏ hàm tới biến số . Nếu tôi có một hàm foocách chính xác để gán con trỏ hàm

int foo(); 

và tôi gán một con trỏ đến foo để thanh biến

void * bar; 

nó dường như không thành vấn đề nếu tôi sử dụng

bar = foo; 
// or 
bar = &foo; 

Dường như với tôi rằng chỉ một trong những điều này phải chính xác hoặc tôi thiếu cái gì đó?

+0

Được rồi, vì vậy con trỏ hàm là một trường hợp đặc biệt cho các nhà điều hành &. –

+0

Điều này thật thú vị: http://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work –

+0

Điều đó thật thú vị. Cảm ơn sự giúp đỡ của bạn, các bạn. –

Trả lời

6

foo&foo giá trị tương đương với C và có cùng loại.

Nhà điều hành & ở đây là chính xác nhưng không cần thiết.

Lưu ý rằng gán một con trỏ hàm để một void * là không hợp lệ trong C.

void *fp1 = foo; // invalid 
int (*fp2)() = foo; // valid 
int (*fp3)() = &foo; // valid 

(Đây là những thực sự khai báo nhưng những hạn chế của toán tử gán được áp dụng.)

+0

'int (* fp2) = foo; 'thậm chí biên dịch ..không có vấn đề gì:) \ –

+0

@GrijeshChauhan không có' -Werror'. 'int (* fp2) = foo;' thực sự không hợp lệ C. – ouah

+0

OK! .. trong 5 phút tôi nghĩ bạn đã nhầm lẫn .. nhưng mọi người đã bỏ phiếu cho câu trả lời của bạn và tôi biết bạn không thể phạm sai lầm nên tôi vừa mới đăng trả lời thay vì bình luận bạn. :) –

1

Hãy để tôi giải thích một chút hơn.

foo và & giá trị foo tương đương với C và có cùng loại.

Điều này không hoàn toàn chính xác như được chỉ ra bởi các nhận xét cho câu trả lời của @ouah. Cụ thể:

  1. sizeof(foo) không hợp lệ và sizeof(&foo) là kích thước của con trỏ.
  2. &foo là con trỏ đến foo, trong khi &(&foo) không hợp lệ.

Tuy nhiên, họ đang thực sự giống nhau ở tất cả các trường hợp khác, như được đề cập bởi các tiêu chuẩn của C (tham chiếu đến, ví dụ, các draft of C11):

6.3.2.1.4: Một function designator là một biểu thức có kiểu hàm. Ngoại trừ khi nó là toán hạng của toán tử sizeof hoặc toán tử & đơn nhất, một trình chỉ định hàm có kiểu "hàm trả về loại" được chuyển thành biểu thức có loại "con trỏ tới hàm trả về".

Các nhà điều hành sizeof và unary & chỉ là hai trường hợp ngoại lệ khi người chỉ định chức năng không được chuyển đổi thành con trỏ.

P.S. Bạn cũng có thể tìm thấy lý do tại sao sizeof(foo)&(&foo) không hợp lệ:

6.5.3.2.1: Các toán hạng của & hành unary phải hoặc là một chức năng vấn thiết kế, kết quả của một nhà điều hành [] hoặc unary *, hoặc một giá trị trái mà chỉ định một đối tượng mà không phải là một chút trường và không được khai báo với thanh ghi lưu trữ-class speci fi er.

6.5.3.4.1 Các nhà điều hành sizeof sẽ không được áp dụng cho một biểu thức có chức năng loại hoặc một loại không đầy đủ, với tên trong ngoặc của một loại như vậy, hoặc một biểu thức chỉ định một thành viên lĩnh bit- fi .

Các vấn đề liên quan