Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Wskaźniki a początkujący w C++

Ostatnio zmodyfikowano 2009-07-10 16:09
Autor Wiadomość
SideC
Temat założony przez niniejszego użytkownika
Wskaźniki a początkujący w C++
» 2009-07-10 13:39:31
(dobrnąłem w kursie do <time.h>)
Witam i bardzo proszę o pomoc.
Sprawa wskaźników wydała mi się prosta, dopóki nie zająłem się typem char*.
Zdziwiło mnie, że cout<<wskaznik; wyświetla ciąg znaków, a nie numeryczny adres, ale przecież kod
C/C++
char znak = 'a';
char * wskaznik =& znak;
* wskaznik = 'b';
wykonuje się prawidłowo. Trzeba więc przyjąć, że tak jest i tyle.
Wątpliwości moje budzi natomiast długość wyświetlanego przez cout ciągu znaków, który z definicji ma być wskazaniem na zmienną, czyli jej adresem w pamięci.
Wskaźnik z powyższego kodu daje 3 znaki.
Jeżeli wskaźnik dotyczy zmiennej zawartej w strukturze, daje 7 znaków.
Wskaźnik z kodu
C/C++
char * data = asctime( ptr );
cout << "Data: " << data;
daje 24 znaki, co wygląda jakby było: char data[24];
O co tu chodzi?

P-8400
pompom
» 2009-07-10 14:33:01
cout traktuje char* jako adres łańcucha znaków, więc wypisuje wszystko, aż napotka zero.
Jeśli chcesz wyświetlić adres, napisz
C/C++
char * x;
cout <<( void * ) x;
P-8404
pompom
» 2009-07-10 14:57:19
A to dlaczego, skoro to robi dokładnie to samo, tylko castowanie C jest krótsze?
Jakby już uzywać castowania c++ to static_cast a nie reinterpret_cast.
Z castowania c++ sens ma dynamic_cast i const_cast, static_cast nie widzę za bardzo (w porównaniu do castowania C, w realnym kodzie) ale jak ktoś chce niech będzie.
Ale reinterpret? No bez jaj...

Ja używam tylko dynamic_cast (wskaźnik do klasy bazowej cast do dziecka) (bardzo rzadko!) + zwykłego castu C (praktycznie tylko operacje na strukturach plikowych gdzie union nie pasuje + konwersja inta do boola).
W zwykłym kodzie cast (poza tymi przypadkami) to najczęściej błąd.
P-8405
WunM
» 2009-07-10 16:18:01
Rzutowanie w stylu C pozwala rzutować na wszystko co wiadomo do czego może prowadzić. Jeśli potrafi się umiejętnie wykorzystać rzutowanie w stylu C to czemu nie. Ale kiedy pojawiają się problemy to warto wykorzystać rzutowanie jakie oferuje C++ (ze względu na czas np.) jeśli chcemy uniknąć większych problemów to  warto porzucić rzutowanie w stylu C. Myślę że na tym można zakończyć tą dyskusję bo znowu zrobi się bałagan jak kiedyś.
P-8406
GoldWolf
» 2009-07-10 19:52:11
Jeśli chcesz sobie poćwiczyć Wskaźniki, w Tutorialach są dwa kursy, które możesz sobie przerobić, oparte są o Kurs C++ zawarty na stronie.
Wskaźniki I
Wskaźniki II
P-8411
SideC
Temat założony przez niniejszego użytkownika
» 2009-07-12 13:53:46
Dzięki za wyjaśnienia, a szczególnie za wskazówki napisane przez Pompom i Dante.
Jednocześnie przyznaję, że na razie jeszcze nie rozumiem nic z wywołanej dyskusji.
P-8443
manfred
» 2009-07-10 14:50:13
Nie. Rzutujemy. W. Stylu. C. Jeśli. Nie. Piszemy. W. C. Amen.
cout << reinterpret_cast < void *>( foo );
P-19022
manfred
» 2009-07-10 16:09:09
Tylko dlatego, że rzutowanie w stylu C jest odradzane przez wszystkich ważniejszych ludzi, od Stroupstrupa poczynając. New-style casts mogą sobie być brzydkie i rozwlekłe, ale o to chodzi - ma być widać, że jest rzutowanie, czyli coś dziwnego. Już totalnie pominę fakt, że rzutowanie w stylu C nie zawsze działa.
W tym przykładzie faktycznie mogłoby być static_cast, chociaż na dobrą sprawę to nawet tutaj da się bez rzutowania.
P-19024
« 1 »
  Strona 1 z 1