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 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 char * data = asctime( ptr ); cout << "Data: " << data; daje 24 znaki, co wygląda jakby było: char data[24]; O co tu chodzi? |
|
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 char * x; cout <<( void * ) x;
|
|
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. |
|
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ś. |
|
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 |
|
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.
|
|
manfred |
» 2009-07-10 14:50:13 Nie. Rzutujemy. W. Stylu. C. Jeśli. Nie. Piszemy. W. C. Amen. cout << reinterpret_cast < void *>( foo ); |
|
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. |
|
« 1 » |