Kiedy przypisuje się adres wskaźnika, a kiedy wskazywaną zmienną?

0

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.

0

Co prawda nie przyglądałem się wybitnie kodowi, ale wziąłeś pod uwagę fakt, że procesory x86 są little-endian?

0

Nawet jeżeli, to co z tego? Big endian czy little endian, konkluzja jest ta sama - w moim odczuciu program powinien wypisywać nie adres zmiennej number, tylko jej wartość, chociaż przeinaczoną ze wzgl. na niezgodność typów.

1

Oh, mój błąd; teraz widzę - wcześniej źle spojrzałem na kod.
Zauważ, że pobierasz adres wskaźnika - możesz sobie zwizualizować to w ten sposób, że wskaźnik jest z punktu widzenia procesora zwykłą liczbą wskazującą na jakiś adres i na tamten stan wartość wskaźnika to adres zmiennej number, stąd taka, a nie inna wartość.

0

Zaskoczyło.

Dzięki.

1 użytkowników online, w tym zalogowanych: 0, gości: 1