TYP WSKAŹNIKOWY
Definicja typu wskaźnikowego:
TYPE nazwa_typu_wskaźnikowego = ^nazwa_typu_bazowego ;
na przykład:
TYPE
wsk_liczby = ^integer ; ← wskaźnik na liczbę całkowitą
wsk = ^char ; ← wskaźnik na znak
tab = array [ 1 .. 10 ] of string ;
wsk_tab = ^tab; ← wskaźnik na tablicę
Nazwa (identyfikator) typu bazowego może być zdefiniowany później
na przykład:
TYPE
wsk_elementu = ^element_listy ; ← wskaźnik na typ <element_listy>
element_listy = record ← definicja typu <element_listy>
nazwisko : string[30];
imię : string [20];
wiek : byte;
plec : char
nastepna_osoba : wsk_elementu;
end;
W języku PASCAL w implementacji firmy Borland istnieją dwa predefiniowane typy wskaźnikowe:
Pointer - wskazanie na dane nieokreślonego typu (na początek dowolnego ciągu bajtów),
PChar - wskaźnik do łańcucha znaków zakończonego znakiem pustym (znakiem ASCII o kodzie 0),
Stała wskaźnikowa nil określa wskaźnik „pusty” ( adres „do nikąd” )
np.
if wsk_tab = nil then ← sprawdzenie ważności wskaźnika
writeln( 'Uwaga !!! Tablica nie została utworzona' )
else
. . . ← wykonanie obliczeń na tablicy dynamicznej
Operatory związane ze wskaźnikami:
@ nazwa_zmiennej
@ - jednoargumentowy operator referencji,
operator uzyskania wskaźnika (adresu) zmiennej:
VAR
i : integer ; ← zmienna „i” typu całkowitego
wsk_int : ^integer ; ← wskaźnik na zmienną typu całkowitego
w programie:
i ← zawartość zmiennej „i”
@ i ← wskaźnik zmiennej „i”
na przykład:
i := 10 ;
wsk_int := @ i ;
wskaźnik_zmiennej^
^ - jednoargumentowy operator dereferencji - „wyłuskania”,
operator uzyskania zawartości obszaru identyfikowanego przez adres zawarty w zmiennej wskaźnikowej:
np. TYPE
tablica = array[ 1 .. 10 ] of real;
VAR
x : real ; wsk_1 : ^real ;
tab : tablica ; wsk_2 : ^tablica ;
begin
x := 11.22 ;
writeln ( 'zawartość zmiennej x =' , x );
wsk_1 := @ x ;
writeln ( 'zawartość zmiennej x =' , wsk_1^ );
tab[ 1 ] := 33.44 ;
wsk_2 := @ tab ;
wsk_2^[ 1 ] := 33.44 ; ← przypisanie do tab[1] poprzez wskaźnik
end.
Procedury przydziału pamięci |
Procedury zwalniania pamięci |
Przydzielenie pamięci na zmienną zadanego typu: New( zmienna_wskaźnikowa ) ; |
Zwolnienie pamięci przydzielonej za pomocą procedury New: Dispose( zmienna_wskaźnikowa ) ; |
np. var wsk_1 : ^ real ; ← deklaracje zmiennych wskaźnikowych wsk_2 : ^ array[1..10]of integer ; begin New( wsk_1 ); ← przydzielanie pamięci New( wsk_2 ); wsk_1^ := 12.34; ← operacje na zmiennych dynamicznych wsk_2^ [1] := 111; wsk_2^ [2] := 222; Dispose( wsk_1 ); ← zwalnianie pamięci Dispose( wsk_2 ); end . |
|
|
|
Przydzielenie pamięci na ciąg bajtów GetMem( zm_wsk , ilość_bajtów ) ; |
Zwolnienie pamięci przydzielonej za pomocą procedury GetMem: FreeMem( zm_wsk, ilość_bajtów ); |
np. var wsk_1 : ^ real ; ← deklaracje zmiennych wskaźnikowych wsk_2 : ^ array[1..10]of integer ; wsk_ciagu_bajtów : pointer ;
begin GetMem( wsk_1, 6 ); ← przydzielanie pamięci GetMem( wsk_2, 10*2 ); GetMem( wsk_ciagu_bajtow, 1024 ); . . . Dispose( wsk_1, 6 ); ← zwalnianie pamięci Dispose( wsk_2, 10*2); FreeMem( wsk_ciągu_bajtow, 1024 ); end . |
|
Zapamiętanie aktualnego stanu sterty (pamięci dynamicznej) w zmiennej wskaźnikowej → parametrze procedury Mark( zmienna_wskaźnikowa ); |
Zwolnienie wszystkich obszarów pamięci dynamicznej przydzielonych od momentu zapamiętania stanu stery w zmiennej Release( zmienna_wskaźnikowa ); |
np. var wsk_1 : ^ real ; ← deklaracje zmiennych wskaźnikowych wsk_2 : ^ array[1..10]of integer ; wsk_ciagu_bajtów : pointer ; stan_sterty : pointer ; begin New( wsk_1 ); Mark( stan_sterty ); ← zapamiętanie stanu sterty New( wsk_2 ); GetMem( wsk_ciagu_bajtow, 1024 ); . . . Release( stan_stery ); ← odtworzenie stanu sterty Dispose( wsk_1); end . |
|
|
|
Wyznaczenie sumarycznej wielkości wolnych obszarów na stercie function MemAvail : longint ; |
Wyznaczenie największego, ciągłego, wolnego obszaru na stercie function MaxAvail : longint ; |
np. var wsk_1 : ^ real ; ← deklaracje zmiennych wskaźnikowych begin if ( MaxAvail < sizeof( real ) ) ← sprawdzenie wielkości wolnej pamięci writeln( 'Błąd !!! Za mało pamięci' ) else begin New( wsk_1 ); . . . Release( wsk_1 ); end ; end . |