Ver. 1.0 Beta, Nie masz kompilatora? Teraz możesz pisać skrypty ONLINE! Wersja podstawowa -nie zawiera wszystkich poleceń Pascala. Służy do nauki podstaw

Zrozumieć wskaźniki w Turbo Pascalu... Są jak spis treści w grubej książce

Pascal

Wsteczwstecz Pętle, for, repeat, while, rekurencja
W góręw górę Podstawy Pascala
Dalejdalej Operacje na tekstach

Zrozumieć wskaźniki w Turbo Pascalu... Są jak spis treści w grubej książce

Wskaźniki w turbo pascalu (pointer)


Wskaźniki przypominają spis treści w grubej książce. Gdybyś podczas rozmowy telefonicznej chciał wskazać koledze konkretne miejsce w jakiejś publikacji, co zrobisz? Czy powiesz mu, otwórz swoją książę na zdaniu... I tu zaczniesz cytować, czy raczej podasz numer strony? Oczywiście numery stron są lepsze, bo ułatwiają szybie odnajdywanie miejsc. Tak samo wskaźniki w programowaniu -pozwalają przeszukiwać spore ilości danych bez wertowania całej pamięci. Podobnie jak przy rozmowie przez telefon, tak samo przy porozumiewaniu się między procedurami w programie potrzeba jak najściślejszych, ale jak najszybszych informacji.


Wskaźniki to adresy pamięci, które pokazują komputerowi miejsce gdzie znajdują się jakieś dane. Możesz przykładowo przechowywać w pamięci wskaźnik na obrazek bitmapowy, podczas gdy przechowywanie obrazu w tablicy byłoby niezbyt praktyczne. Pamięć do której odnoszą się wskaźniki można w każdej chwili zwalniać, deklarować i zmieniać.


Bez wskaźników nie byłoby możliwe nieograniczone tworzenie nowych danych, np. w słowniku. Gdyby nie wskaźniki mielibyśmy z góry określoną liczbę słów, które słownik byłby w stanie zapamiętać. W grach komputerowych, liczba ludzików, zbudowanych elementów w strategii, zawsze byłaby z góry ograniczona. Nie moglibyśmy w systemie uruchomić większej liczby programów niż zaplanowano.


Wskaźniki mogą wskazywać na dowolny obszar pamięci, a adres ten można zmieniać. Są pomocne podczas alokacji pamięci. Kiedy chcemy ją zadeklarować w czasie trwania programu, funkcja GetMem zwraca nam właśnie wskaźnik -czyli miejsce gdzie będziemy mogli wpisywać swoje dane. Gdybyśmy spróbowali wspisać swoje dane bez wcześniejszego zarezerwowania pamięci, w najlepszym wypadku zakończyłby się nasz program, w gorszym zawiesilibyśmy komputer.



Budowa wskaźników*

Ze względu na ryzoko zawieszenia programu wskaźniki są traktowane jako typy, które należy umiejętnie stosować. Wskaźniki na ogół zbudowane są z 4 bajtów. Pierwsze 2 określają segment danych, kolejne 2 ofset.


Pamięć konwencjonalna (pierwszy 1MB pamięci komputera) podzielony jest na segmenty po 16KB każdy. Tak więc 1 segment ma adres 0, drugi 1, trzeci 2, itd... Ofset to przemieszczenie względem segmentu. Dzięki ofsetowi możemy dojść do każdego jednego bajtu pamięci. Adres typu pointer składa się z dwóch bajtów segmentu, dwóch ofsetu i jest najczęściej zapisywany w kodzie szesnastkowym, dzięki czemu jest bardziej czytelny, np.


 

$a000:00, $b800:00



Typ pointer

Typ wskaźników nazywa się pointer. Gdy jakąś zmienną zadeklarujesz jako poiner, będzie ona wskaźnikiem. Wskaźniki mogą adresować różne typy zmiennych. Mogą adresować liczby, napisy, tablice, itd. Gdy adresują konkretny typ, nie deklaruje się ich jako pointer, tylko tworzy swój własny typ -o tym przeczytasz za moment.



Podstawianie wskaźników

Żeby wskaźnik wskazywał adres jakiejś zmiennej, możemy napisać:


var
  wskaznik : pointer; {lub podobny typ}

{...}

wskaznik := @nazwa_zmiennej;

znacznik @ oznacza pobranie adresu zmiennej. Gdybyśmy chcieli teraz coś zapisać pod wskazanym miejscem wystarczy wywołać wskazywane miejsce, za pomocą znaku ^


 wskaznik^ := nowa_wartosc;

W podanym przykładzie trzeba by wskaźnik był zadeklarowany jako wskaźnik na liczbę. Gdybyśmy bez rzutowania i bez określenia rodzaju wkaźnika próbowali mu podstawić wartość wystąpiłby błąd "illegal assigment".



Jak zadeklarować wskaźnik na liczbę?
np.


type p_liczba = ^integer; {utworzenie nowego typu - wskaźnika na liczbę}
var liczba : p_liczba;
   i : integer;

begin
   liczba := @i;
   i:=2;
   liczba^:=4;
end.

{teraz i = 4 a nie 2!}


Można ewentualnie potraktować typ pointer jako wskaźnik na liczbę co nazywa się rzutowaniem -dzięki temu unikniemy błędu a  powiemy kompilatorowi, że wpisujemy w niego liczbę Integer


 var liczba : pointer;
     i : integer;

begin
   liczba := @i;
   i:=2;
   integer(liczba^):=4;
end.

Strona korzysta z plików cookie w celu świadczenia usług Google (reklamy, statytyki) oraz Facebook. Jeśli chcesz zablokować pliki cookies wyłacz je w swojej przeglądarce. Potrzebujesz pomocy? kliknij