Pozwól mi wyjaśnić co nieco jeszcze.
foo i & Wartości foo są równoważne w C i mają ten sam typ.
To nie jest w pełni poprawne, jak wskazano w komentarzach do odpowiedzi przez @ouah. W szczególności:
sizeof(foo)
jest nieprawidłowy, a sizeof(&foo)
jest wielkości wskaźnika.
&foo
to wskaźnik do foo, natomiast &(&foo)
jest nieprawidłowy.
Jednak są one faktycznie takie same we wszystkich innych przypadkach, jak wspomniano w standardzie C (w odniesieniu do, na przykład, The draft of C11):
6.3.2.1.4: A oznaczenie funkcji jest wyrażeniem mającym typ funkcji. Z wyjątkiem sytuacji, gdy jest operandem operatora sizeof lub unitarnego operatora &, , oznaczenie funkcji z typem "typ zwracany przez funkcję" jest konwertowane na wyrażenie, które ma typ "wskaźnik do zwracającego funkcję typu".
The sizeof
i jednoargumentowych &
operatorów są tylko dwa wyjątki, gdy oznaczenie funkcja nie jest konwertowany do wskaźnika.
P.S. Możesz również znaleźć powód, dla którego sizeof(foo)
i &(&foo)
jest nieprawidłowy:
6.5.3.2.1: Operand operatora jednoargumentowego &
musi być albo desygnatorem funkcji, wynikiem operatora []
lub unarnego operatora *
, albo lwartością, która oznacza obiekt, który nie jest polem bitowym i nie jest zadeklarowany z klasą pamięci rejestru speciFer.
6.5.3.4.1 Operator sizeof
nie stosuje się do ekspresji, który ma funkcji typu lub niekompletny rodzaju produktu, nazwy nawiasach takiego typu, lub do ekspresji, który wyznacza człon pld fi bitowo .
OK, więc wskaźniki funkcji są szczególnym przypadkiem operatora &. –
To jest interesujące: http://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work –
To jest interesujące. Dzięki za pomoc, chłopaki. –