Zauważyłem, że niektórzy używają następującej notacji do deklarowania zmiennych wskaźnikowych.
(a) char* p;
zamiast
(b) char *p;
Używam (b). Jakie jest uzasadnienie zapisu (a)? Notacja (b) ma dla mnie większy sens, ponieważ wskaźnik znaku sam w sobie nie jest typem. Zamiast tego typ jest znakowy, a zmienna może być wskaźnikiem do znaku.
char* c;
Wygląda na to, że istnieje typ char *, a zmienna c jest tego typu. Ale w rzeczywistości typ to char, a * c (miejsce w pamięci wskazywane przez c) jest tego typu (char). Jeśli zadeklarujesz wiele zmiennych naraz, to rozróżnienie stanie się oczywiste.
char* c, *d;
To wygląda dziwnie. Zarówno c, jak i d są tego samego rodzaju wskazówkami, które wskazują na znak. W tym od następnego wygląda bardziej naturalnie.
char *c, *d;
Dzięki.
c++
c
pointers
coding-style
keeda
źródło
źródło
char *t
wygląda dobrze, więcchar * t;
zamiast tego mogę to zrobić . Jednak ja też często widziałemchar* t;
.char
oraz (a) pokazuje p jestpointer to a char
Odpowiedzi:
Bjarne Stroustrup powiedział:
Źródło: http://www.stroustrup.com/bs_faq2.html#whitespace
Poleciłbym ten drugi styl, ponieważ w sytuacji, gdy deklarujesz wiele wskaźników w jednej linii (Twój czwarty przykład), gwiazdka ze zmienną będzie tym, do czego jesteś przyzwyczajony.
źródło
int *p
co oznacza: kiedyp
jest dereferencjonowany, otrzymuję plikint
. Wtedy wiele deklaracji rozdzielonych przez,
ma sens:int *p, *q, r
(gdy dereferencjap
lubq
jest dereferencjonowana, otrzymujęint
, kiedyr
jest odwołanie, otrzymujęint
). Również składnia wskaźnika funkcji ma sens:int (*f)()
(kiedyf
jest wyłuskiwany i nazywany, otrzymujęint
). I to ma sens:int *p, (*f)()
.int*
. Dla mnieint *p, (*f)()
nie ma to większego sensu, ale w pewnym sensie widzę, jak by to było dla niektórych ludzi w niektórych sytuacjach.void*
(i nie działa w ogóle dla referencji C ++).Osobiście wolę umieszczać
*
z resztą typuchar* p; // p is a pointer to a char.
Ludzie będą się kłócić „ale potem zaczną
char* p, q;
wprowadzać w błąd”, na co ja mówię „więc nie rób tego”.źródło
cout << *p;
. Dlaczego więc nie postawić gwiazdki przedp
deklaracją*p
:? Moim zdaniem byłoby mniej zagmatwane.Nie ma różnicy, jak pisać. Ale jeśli chcesz zadeklarować dwa lub więcej wskaźników w jednej linii, lepiej użyj wariantu (b), ponieważ jest jasne, czego chcesz. Zobacz poniżej:
int *a; int* b; // All is OK. `a` is pointer to int ant `b` is pointer to int char *c, *d; // We declare two pointers to char. And we clearly see it. char* e, f; // We declare pointer `e` and variable `f` of char type. // Maybe here it is mistake, maybe not. // Better way of course is use typedef: typedef char* PCHAR; PCHAR g, h; // Now `g` and `h` both are pointers. // If we used define construction for PCHAR we'd get into problem too.
źródło
typedef
nie jest lepszym sposobem „oczywiście”. Niektórzy ludzie mogą to preferować, ale problematyczne jest, jeśli z kodem pracuje wiele osób. Gdybym nie był do tego przyzwyczajonyPCHAR
, mógłbym napisać coś w styluPCHAR *p;
, co byłobychar**
a nie to, co zamierzam. Ogólnie rzecz biorąc, jeśli chceszchar**
, musiałbyś napisaćPCHAR*
lub zdefiniować nowy typ, a wtedy zaczyna się po prostu głupie.Kompromis jest
char * p;
K&R używa
char *p;
To zależy od Ciebie, chyba że przestrzegasz standardu kodowania - w takim przypadku powinieneś postępować zgodnie z tym, co robią wszyscy inni.
źródło
char* p;
. to kwestia stylu, a nie konwencji czy zasad. dla mnie bardziej sensowne jest to, że p jest typemchar*
, więc oczywiście * powinno być z typem.clang-format
tak korzystają .Wszystko to kwestia preferencji, osobiście w projektach widzę znak * Zwykle deklaruję wiele wskaźników w oddzielnych wierszach. Nie ma prawdziwego „właściwego” sposobu, aby to zrobić i wszystko sprowadza się do preferencji. Niektórzy twierdzą, że łatwiej jest przeczytać (a), podczas gdy inni twierdzą, że (b) łatwiej jest zadeklarować więcej zmiennych tego samego typu w tej samej linii.
Uważam, że (b) jest bardziej powszechne, aw niektórych przypadkach widziałem
char * a;
lub coś w tym stylu. Znowu preferencja. Użyję tego, z czym czujesz się komfortowo lub w jakimkolwiek projekcie, nad którym pracuję (chyba, że napiszę to sam, w takim przypadku użyję (a))
źródło