prostu zastanawiasz się, czy jest jakaś różnica pomiędzy:Różnica między znakami * var; i char * var ;?
char* var;
char *var;
czy jest to tylko kwestia preferencji (rozstaw)?
prostu zastanawiasz się, czy jest jakaś różnica pomiędzy:Różnica między znakami * var; i char * var ;?
char* var;
char *var;
czy jest to tylko kwestia preferencji (rozstaw)?
Nie ma różnicy w tym przypadku. Jednak powinieneś preferować char *var;
.
Jest tak, ponieważ *
jest ściślej związany z nazwą zmiennej i jest nie jest częścią podstawowego typu. Na przykład, jeśli to zrobić:
char* a, b;
Co masz jest a
, wskaźnik-to- char
i b
, A char
. To jest mylące! Ponieważ charakter *
jest bliżej do hasła char
, oczekujemy, że rodzaje obu zmiennych będzie pointer-to- char
, ale *
jest faktycznie związana tylko z a
. (Jest to podobne do char a[10], b;
jak wskazuje teppic w komentarzach, a [10]
specyfikator jest również tylko związane z a
, a więc tylko a
będzie tablica).
Prawidłowe zgłoszenie to:
char *a, *b;
Umieszczenie *
specyfikator bliżej zmiennej oznacza, że jest to łatwe, aby zobaczyć, co się dzieje, gdy zamierzają dla jednej zmiennej jako wskaźnik, a drugi nie:
char *a, b;
W tym przypadku jest oczywiste, że b
nie był wskaźnikiem. W oryginalnym przykładzie (char* a, b;
) nie wiemy, czy programista zamierzał ustawić wskaźnik na b
. Aby pożyczyć od Douglasa Crockforda, wiemy tylko, że programista jest niekompetentny.
Niektórzy ludzie lubią stawiać spacji przed i po *
:
char * a, * b;
Ten pada ofiarą tego samego problemu przedstawionego powyżej: jeśli b
nie jest wskaźnikiem wówczas deklaracja (char * a, b;
) może również prowadzić do niepewność co do intencji programisty. Dlatego sugeruję nie umieszczać spacji między *
a nazwą zmiennej .
Jakkolwiek na to spojrzeć, char* var;
należy traktować jako zły styl. Jest poprawna gramatycznie zgodnie ze specyfikacją języka, ale prowadzi do nieczytelnego kodu, ponieważ pojawia się, aby wskazać, że specyfikator *
jest częścią typu współużytkowanego przez wszystkie zmienne w tej samej deklaracji, kiedy tak nie jest. (Jest to podobne do pisania złożonej funkcji na tej samej linii - działa, ale to zły pomysł, są przypadki, w których czytelność i łatwość obsługi zastępują osobiste preferencje stylistyczne, a to jest jedna z nich.)
Osobiście wolę postawić spację po *
tylko gdy ma do czynienia z wartościami obie funkcję:
char * foo();
Jest to jednoznaczne: to funkcja, która zwraca wskaźnik -to-char
.
char *foo();
Czy programista oznacza funkcję, która zwraca wskaźnik-to- char
, czy miał na myśli, aby stworzyć wskaźnik do funkcji, która zwraca char
? Język rozwiąże to jako identyczny z innym prototypem, ale naszym celem jest czytelność, a to oznacza przekazanie dokładnie tego, co rozumiemy dla ludzi, a nie tylko kompilatora.
Przydaje się również porównanie asocjacji [] w celu zdefiniowania tablicy i() aby zdefiniować funkcję. Mimo że są one zgodne z identyfikatorem, jest to ta sama zasada, co definiowanie wskaźnika za pomocą *. – teppic
@teppic Dobrze, te specyfikatory również zachowują się w ten sam sposób. Zachowanie '*' ma nieco więcej sensu, gdy je rozważasz. – cdhowie
Podoba mi się również styl 'char * var', ponieważ moim zdaniem sprawia, że semantyczne znaczenie' * 'jest bardziej spójne. 'char * var' oznacza, że typ wartości * dereferencji * wskazanej przez' var' to 'char', co jest prawdą. 'char * var' wygląda tak, jak umieszczamy operatora dereferencji po niewłaściwej stronie nazwy zmiennej' char', co nie ma żadnego sensu. –
Nie ma różnicy, po prostu kwestia preferencji, jak sam pan powiedział
Są to równoważne deklaracje. – ouah
http://stackoverflow.com/questions/398395/in-c-why-is-the-asterisk-before-the-variable-name-rather-than-after-the-type http://stackoverflow.com/ questions/3770187/difference-between-int-i-and-int-i – cnicutar
to tylko kwestia preferencji, char * x jest często używany –