Gwiazdka w deklaracjach

2008-02-24 19:42

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:

  1. int* p1;
  2. int *p2;

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:

  1. int *a, b;

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ć:

  1. int *p = 0;

to w konwencji int *p2; wygląda to na pierwszy rzut oka dość dziwnie. Zgodnie z interpretacją “*p jest intem” 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ą.

Be Sociable, Share!
Be Sociable, Share!
Tags: ,
Author: Xion, posted under Programming »


15 comments for post “Gwiazdka w deklaracjach”.
  1. Kurak:
    February 24th, 2008 o 20:04

    Nie ma to jak pisanie powieści o pierdołach ;>

  2. deX(ter):
    February 24th, 2008 o 20:59

    Bloga roku Xion nie dostał, to sobie może pozwolić ;P.

    A ja tam jestem za: int *p; Czytelniejsze to ;].

  3. freakpp:
    February 24th, 2008 o 21:06

    ‘const int* const tehpointer’ zadziała, a ‘const int const *tehpointer’? Lepiej przy typie.

  4. krajek:
    February 24th, 2008 o 21:50

    O matko ale problem :
    ja pisze tak:
    int * p = 0;
    i w ogóle nie ma problemu. :D

  5. krajek:
    February 25th, 2008 o 7:23

    Ejj wycięło mi spacje z poprzedniego commenta ;p.

  6. Riddlemaster:
    February 25th, 2008 o 10:57

    Faktycznie Xion – nie masz większych problemów :) ? A ja piszę int* p;

  7. Dynax:
    February 25th, 2008 o 16:35

    Ja jednak preferuję:
    BITMAP* obrazek;

    PS: Xion, musiało ci się starasznie nudzić :)

  8. maVes:
    February 25th, 2008 o 17:07

    Ja również wolę zapis
    int* p = 0;
    A jeśli potrzebuję dwóch wskaźników to definiuję je jeden pod drugim :)

  9. Tarains:
    February 25th, 2008 o 17:41

    Ja piszę tak jak Krajek i nie widzę żadnego problemu :)

  10. Xion:
    February 25th, 2008 o 20:22

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

  11. krajek:
    February 25th, 2008 o 22:09

    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.

  12. kaszuba:
    February 26th, 2008 o 15:05

    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

  13. nameczanin:
    February 26th, 2008 o 21:14

    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

  14. Xion:
    February 26th, 2008 o 21:57

    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

  15. Reg:
    March 2nd, 2008 o 9:28

    Nie uwzględniłeś trzeciej możliwej notacji:

    int * p;

Comments are disabled.
 


© 2023 Karol Kuczmarski "Xion". Layout by Urszulka. Powered by WordPress with QuickLaTeX.com.