Odpowiedź
Jeśli napiszesz:
int* i, j, k;
błędnie sugerujesz, że wszystkie i, j oraz k są wskaźnikami do int
.
Dlatego uważam, że lepsze jest załączanie * do zmiennej name.
Komentarze
Odpowiedź
Wolę int* i
ponieważ i
ma typ „wskaźnik do int” i wydaje mi się, że jest to jednolite z systemem typów. Oczywiście dobrze znane zachowanie pojawia się, gdy próbuję zdefiniować wiele wskaźników w jednym wierszu (mianowicie gwiazdkę należy umieścić przed nazwą każdej zmiennej, aby zadeklarować wskaźnik), ale po prostu nie deklaruję wskaźników w ten sposób. Uważam też, że to „poważna wada języków w stylu C.
Komentarze
Odpowiedź
W przypadku języka C, w którym nie skupiamy się na typach, wolę:
int *i;
Ponieważ ma empezę na int
, a nie na wskaźniku. Co to jest int
? *i
to int.
Komentarze
Odpowiedź
Od lat wolę int* i
. Istnieje jednak mocny argument przemawiający za int *i
, ponieważ używając poprzedniego stylu, nadal musisz pamiętać o zasadzie wielokrotnych deklaracji:
int* a, *b; // not int* a, b;
Ponieważ musisz zapamiętać tę regułę, nie zyskujesz w prosty sposób – ale nie powiedziałbym też, że jest to bardziej złożone. Unikanie wielu deklaracji w jednym wierszu to po prostu kolejny sposób na stwierdzenie, że pamiętasz tę regułę . Różnica między tymi dwoma stylami jest dyskusyjna.
Jednak nawet jeśli go używam, wydaje się trochę głupio udawać, że składnia deklaracji C działa inaczej niż to robi, umieszczając gwiazdkę obok typu, a raczej niż zmienna, z którą jest związana składniowo.
Nie kupuję tej jednej podkreśla typ wskaźnika (dla i
), podczas gdy druga kładzie nacisk na typ int (dla *i
), ale może tak być, że po 15 latach używania C i C ++ po prostu jest , kiedy na to patrzę, bez zastanawiania się nad tym – „coś” Większość początkujących, którzy zadają to pytanie, jeszcze tego nie zrobi.
Ponadto, nawet biorąc pod uwagę moje preferencje, nie uważam za niewygodne czytanie / pisanie kodu w innym stylu. Spójność, bla bla bla.
Nie trzeba nawet wspominać o int * i
.
Odpowiedź
Wolę pierwszą. Jest to naturalne, ponieważ wskaźnik jest częścią typu.
Ponieważ używam C #, obsługuje typy w bardziej intuicyjny sposób niż C, więc nie ma problemu z zadeklarowaniem kilku wskaźników w tej samej instrukcji:
int* a, b, c; // three pointers
Odpowiedź
Odpowiedź
Jeśli chcesz zadeklarować wiele zmiennych, ale nie chcesz powtarzać gwiazdki:
template <typename T> struct pointer_to { typedef T* type; }; pointer_to<int>::type p1, p2, p3;
(Jak widać w szablonie struktury, Wolę styl int* i
.)
A oto bardziej ogólne rozwiązanie:
template <typename T> struct identity { typedef T type; }; identity<int*>::type p1, p2, p3;
Ten działa z każdym „problematycznym typem”, na przykład tablicami i referencjami:
Komentarze
Odpowiedź
Chciałbym wybrać int* i;
ponieważ pierwsza część oznacza typ zmiennej (wskaźnik do int), podczas gdy druga część określa nazwę (i
). Nie miałoby to dla mnie sensu typ to int
, a nazwa to *i
. Ponadto int * i;
wygląda trochę jak mnożenie.
Komentarze
Odpowiedź
W deklaracjach używam int * i;
, czytasz to jako i is a pointer to an integer
.
Wskaźnik wpływa zarówno na typ, jak i na zmienną, więc powinien znajdować się w środku.
Dobrze jest unikać deklarowania wielu rzeczy w tej samej linii: int * i, j;
Odpowiedź
W C nie ma typów wskaźników! Więc, „int * „nic nie znaczy. Gwiazdka jest zawsze związana z elementem zapisanym na prawo od niej, należy do elementu prawa do niej.” * i „to int. A ponieważ * i jest int, wynika z tego, że i jest wskaźnik do int. Taka jest logika stojąca za tym i dlatego „int * i” jest jedynym możliwym rozwiązaniem. Wszystko inne jest iluzją (co w większości przypadków jest automatycznie korygowane przez kompilator). W C ++ i C # to coś innego. Ale dla C jest tylko jedna Biblia: „Dennis M. Ritchie: Język programowania C”. Dennis (RIP!) Napisał to: „int * i”. Nie ma potrzeby zakwestionuj to.
Komentarze
Odpowiedź
Właściwie używam wszystkich trzech konwencji w określonych okolicznościach. Na pierwszy rzut oka wydaje mi się, że jest to niespójne, ale …
-
int *
, gdy identyfikator nie jest obecny, aby wizualnie podkreślić brak nazwy.
-
int* intptr
na typedef
i podobnych deklaracjach, aby wizualnie potwierdzić, że jest to część typu. Podobnie z deklaracjami wskaźników funkcji: (int* (*foo)(int))
-
int *identifier
i class &identifier
na parametrach funkcji, aby wizualnie podkreślić, że parametr jest potencjalnie tzw. parametrem „out”.
-
const int * const * const
ilekroć używam cv kwalifikatory.
-
int * foo;
na lokalnych deklaracjach.
Myślę, że jestem trochę zorientowany wizualnie.
Odpowiedź
Używam int *i
, ponieważ łatwiej jest zobaczyć, że jest to wskaźnik Nie sądzę, żeby to było naprawdę ważne.