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ể:
sizeof(foo)
không hợp lệ và sizeof(&foo)
là kích thước của con trỏ.
&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)
và &(&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 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 &. –
Điều này thật thú vị: http://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work –
Điều đó thật thú vị. Cảm ơn sự giúp đỡ của bạn, các bạn. –