konwersja typu wskaźnika za pomocą operatora reinterpret_cast
Ostatnio zmodyfikowano 2016-05-05 09:20
lukasz427 Temat założony przez niniejszego użytkownika |
konwersja typu wskaźnika za pomocą operatora reinterpret_cast » 2016-05-02 21:22:58 Witam Poniżej mam prosty program, w którym ustawiam wsk_double do doublów na to co pokazuje wsk_int do pokazywania na obiekty int: wsk_double = reinterpret_cast<double*>(wsk_int); Wsk_double został ustawiony na to co pokazuje wsk_int (Wskaźnik wsk_int został wcześniej ustawiony na zmienną "a", która została inicjalizowana wartością 1.) Moje pytanie brzmi: dlaczego odnosząc się następnie do zmiennej "a" poprzez instrukcję: *wsk_double = 17.79; nie zmieniam jej wartości? Rozumiem,że są innego typu w takim razie dlaczego nie zaokrągla i nie wychodzi np. a= 17? Czy za pomocą operatora reinterpret_cast stosowanego w takim przypadku nie można odnieść się do obiektu w ten sposób? Z góry dziekuję. #include <iostream> using namespace std;
int main()
{ int a = 1; double b = 2.28; int * wsk_int; wsk_int = & a; cout << "wsk_int = " <<( * wsk_int ) << endl; double * wsk_double; wsk_double = reinterpret_cast < double *>( wsk_int ); * wsk_double = 17.79; cout << "wsk_double = " <<( * wsk_double ) << endl; cout << "a = " << a << endl; }
|
|
pekfos |
» 2016-05-03 00:35:23 Ten program ma niezdefiniowane zachowanie. |
|
lukasz427 Temat założony przez niniejszego użytkownika |
» 2016-05-03 23:14:42 Co to oznacza, ze program ma niezdefiniowane zachowanie? Jestem poczatkujacy, |
|
Kaikso |
» 2016-05-03 23:46:05 Program ma niezdefiniowane zachowanie kiedy ono nie wynika wprost z jego kodu ale zależy od kompilator, architektury, środowiska i/lub inny zmiennych czynników niezależnych od języka programowania. |
|
j23 |
» 2016-05-04 09:42:17 Jeśli ten kod kompilowany jest w 32-bitach, to jest w nim błąd. Typ int (na x86) ma wielkość 4 bajtów, double - 8. Przypisanie *wsk_double = 17.79; spowoduje nadpisanie dodatkowych czterech bajtów stosu, a to może powodować trudne do wykrycia błędy.
Sprawdź, czy b ma taką samą wartość po przypisaniu nowej wartości *wsk_double. |
|
Monika90 |
» 2016-05-04 09:57:39 Gdyby rozmiary int i double (i wyrównanie) były takie same, to i tak zachowanie programu byłoby niezdefiniowane. Zabronione jest używanie obiektu typu int przez wskaźnik do double. |
|
mateczek |
» 2016-05-04 13:17:55 A może kolega zdradzi cel swoich wysiłków ?? po co chce rzutować double na int?? Skoro to zupełnie inny sposób zapisu danych w pamięci i ogólnie sieczka z tego wyjść powinna ?? |
|
lukasz427 Temat założony przez niniejszego użytkownika |
» 2016-05-04 21:13:43 Dzieki za wskazówki. Zapytałem, ponieważ jestem na etapie wskaźników.Ucze się z "Symfonii..." i dotarłem do wykorzystania operatora reinterpret_cast przy wskźnikach.Autor pisze,że można wskazywać wskaźnikiem jednego typu na to co pokazuje drugi wskaźnik innego typu właśnie za pomocą reinterpret_cast.
Będąc szczerym to nie wiem do czego to można wykorzystać i wymyśliłem aby lepiej to zrozumieć ten prosty program.
Mój wniosek jest taki:
Wygląda na to, że można pokazać wskaźnikiem jednego typu na to co pokazuje wskaźnik drugiego typu ale nie można się odnieść do obiektu na który pokazuje wskaźnik.
|
|
« 1 » 2 |