2013-03-07 16 views
8

Jestem trochę zdezorientowany z powodu poprawnej składni przypisywania wskaźnika funkcji do zmiennej . Jeśli mam foo functionpoprawny sposób przypisania wskaźnika funkcji

int foo(); 

i jestem przypisanie wskaźnika do foo zmiennej pasku

void * bar; 

to nie wydaje się ważne, czy używam

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

Wydaje mnie, że tylko jeden z nich powinien być poprawny lub czy czegoś brakuje?

+0

OK, więc wskaźniki funkcji są szczególnym przypadkiem operatora &. –

+0

To jest interesujące: http://stackoverflow.com/questions/840501/how-do-function-pointers-in-c-work –

+0

To jest interesujące. Dzięki za pomoc, chłopaki. –

Odpowiedz

6

foo i &foo wartości są równoważne w C i mają ten sam typ.

Operator & tutaj jest poprawny, ale nadmiarowy.

Należy pamiętać, że przypisanie wskaźnik funkcji do void * nie jest ważny w C.

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

(Są to rzeczywiście deklaracje ale ograniczenia zastosowania operatora przypisania).

+0

'int (* fp2) = foo; 'nawet kompiluje ... nie ma problemu:) \ –

+0

@GrijeshChauhan nie z' -Werror'. 'int (* fp2) = foo;' jest faktycznie nieprawidłowy C. – ouah

+0

OK! .. przez 5 minut Myślałem, że popełniłeś błąd .. ale ludzie głosowali twoją odpowiedź i wiem, że nie możesz popełnić błędu, więc właśnie napisałem odpowiedź zamiast komentowania Ciebie. :) –

1

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:

  1. sizeof(foo) jest nieprawidłowy, a sizeof(&foo) jest wielkości wskaźnika.
  2. &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 .

Powiązane problemy