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