Na stronie http://www.tutorialspoint.com/pascal/pascal_pointers.htm jest podany następujący przykład wykorzystania wskaźników w Pascalu:
program exPointers;
var
number: integer;
iptr: ^integer;
y: ^word;
begin
number := 100;
writeln('Number is: ', number);
iptr := @number;
writeln('iptr points to a value: ', iptr^);
iptr^ := 200;
writeln('Number is: ', number);
writeln('iptr points to a value: ', iptr^);
y := addr(iptr);
writeln(y^);
end.
Z komentarzem, że ten program powinien wypisać adres na który wskazuje wskaźnik iptr.
Jak to możliwe? Jak na mój rozum, to sprawy powinny się mieć tak:
a) y=addr(iptr)
- wskaźnikowi y przypisujemy adres, na który wskazuje wskaźnik iptr - czyli że odtąd y wskazuje dokładnie na zmienną number, z tym że y jest wskaźnikiem do zmiennej o typie word, a number jest typu integer, więc mamy niezgodność typów
b) writeln(y^)
- wypisujemy zdereferowany wskaźnik y - czyli wypisujemy zmienną number, ale interpretowaną tak jakby była typu word, nie integer (czyli, zakładając że integer ma 32 bity z bitem znaku (dla liczb dodatnich o ile pamiętam równym chyba 0) na początku, a word ma 16 bitów bez bitu znaku - to reprezentacja number (który przechowuje liczbę 200) powinna się przedstawiać tak: 00000000000000000000000011001000
Natomiast interpretacja tego ciągu bitów jakby to była zmienna typu word powinna wyglądać tak, że zostanie wzięte pod uwagę tylko pierwszych 16 bitów powyższego ciągu, które są równe 0
- a zatem, powinno się wypisać po prostu 0
!
Niemniej, na moim komputerze wypisuje się ustawicznie 26368
.
Gdzie robię błąd w moim rozumowaniu? Z góry dzięki.