2013-03-04 22 views
18

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)?

+1

Są to równoważne deklaracje. – ouah

+3

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

+1

to tylko kwestia preferencji, char * x jest często używany –

Odpowiedz

41

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.

+0

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

+0

@teppic Dobrze, te specyfikatory również zachowują się w ten sam sposób. Zachowanie '*' ma nieco więcej sensu, gdy je rozważasz. – cdhowie

+1

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. –

5

Nie ma różnicy, po prostu kwestia preferencji, jak sam pan powiedział

Powiązane problemy