Oto odwieczny dylemat programistów C/C++: jak deklarować wskaźniki? A dokładniej: w którym miejscu umieścić gwiazdkę? Wybór dotyczy dwóch wariantów składniowych:
Dla kompilatora są one oczywiście równoważne, jednak zwolennicy każdego z nich potrafią podać całe mnóstwo argumentów za jednym i przeciwko drugiemu. I tak: przyklejanie gwiazdki do typu docelowego wskaźnika (tutaj int
) jest popierane tym, że jest ona częścią typu wskaźnikowego (czyli int*
). Z drugiej strony kruczkiem jest, iż deklaracja:
tworzy wskaźnik a
oraz zwykłą zmienną b
– co stanowi argument na rzecz przyklejenia gwiazdki jednak do nazwy zmiennej.
Czy to więc kwestia gustu? Być może. Ja osobiście preferuję styl int* p1;
, a ostatnio odnalazłem jeszcze jeden argument, który może za tym przemawiać. Jeśli bowiem oprócz zadeklarowania wskaźnika zechcemy go też zainicjalizować:
to w konwencji int *p2;
wygląda to na pierwszy rzut oka dość dziwnie. Zgodnie z interpretacją “*p
jest int
em” wychodzi bowiem także na to, iż “inicjalizujemy *p
zerem”. Można więc pomyśleć – zwłaszcza przy mniejszym doświadczeniu w programowaniu w C/C++ – że inicjujemy nie sam wskaźnik, lecz wartość, na którą on wskazuje. To rzecz jasna nieprawda; nadal inicjowany jest wskaźnik, otrzymuje on swój początkowy adres.
Wytrawni koderzy nie popełniliby naturalnie takiej pomyłki. Pamiętajmy jednak, że dobrze napisany kod powinien wymagać możliwie najmniej zastanowienia nad sprawami nieistotnymi. A znaczenie powyższej konstrukcji wydaje się właśnie taką nieistotną sprawą.
Nie ma to jak pisanie powieści o pierdołach ;>
Bloga roku Xion nie dostał, to sobie może pozwolić ;P.
A ja tam jestem za: int *p; Czytelniejsze to ;].
‘const int* const tehpointer’ zadziała, a ‘const int const *tehpointer’? Lepiej przy typie.
O matko ale problem :
ja pisze tak:
int * p = 0;
i w ogóle nie ma problemu. :D
Ejj wycięło mi spacje z poprzedniego commenta ;p.
Faktycznie Xion – nie masz większych problemów :) ? A ja piszę int* p;
Ja jednak preferuję:
BITMAP* obrazek;
PS: Xion, musiało ci się starasznie nudzić :)
Ja również wolę zapis
int* p = 0;
A jeśli potrzebuję dwóch wskaźników to definiuję je jeden pod drugim :)
Ja piszę tak jak Krajek i nie widzę żadnego problemu :)
Hej, jak można mówić, że ta kwestia jest nieważna? Przecież to prototyp wszystkich tzw. świętych wojen, w których każdy usilnie chce udowodnić wyższość jednego z w przybliżeniu równorzędnych rozwiązań (Windows v. Linux, DirectX v. OpenGL). Więc to _bardzo_ ważna sprawa :)
Tarains sens mojej wypowiedzi został zatarty przez wycięcie ‘nadmiarowych’ spacji których dałem po obu stronach * kilkanaście . :) A tak naprawdę to ja nie pamiętam jak pisze;p.
A ja tam wole int *p, bo moze zapis int* p wskazuje ze to jest wskaznik na int, ale co jak by bylo np.
int* p,* p2, *p3 to jest to jak dla mnie bardziej nieczytelne niz:
int *p, *p2, *p3
Sam się kiedyś nad tym zastanawiałem i muszę przyznać, że stosuję gwiazdki tak jak Xion. Wskąźnik tworzy jakby nowy typ – “wskaźnik na obiekt typu “. I – tak jak napisałeś – to nie jest już to samo co “obiekt typu “, a więc przypisanie np. zera tyczy się tutaj już czegoś innego!
Gratuluję pomysłowości na notkę. Ja takich “pierdół” (czyt. szczegółów… [a może odwrotnie]) prawie już nie pamiętam. Może teraz napiszesz o tym czy lepsze
#define NULL 0
czy
#define NULL (void*)0 [w vc6 chyba było coś takiego?]
czy
const int null = 0;
extern null;
xd
A to zresztą nie jest takie śmieszne, skoro Stroustrup wspomina w swoim FAQ o niższości NULL-a wobec zera:
http://www.research.att.com/~bs/bs_faq2.html#null
Nie uwzględniłeś trzeciej możliwej notacji:
int * p;