Pascal - Puntatori
I puntatori in Pascal sono facili e divertenti da imparare. Alcune attività di programmazione Pascal vengono eseguite più facilmente con i puntatori e altre attività, come l'allocazione dinamica della memoria, non possono essere eseguite senza utilizzare i puntatori. Quindi diventa necessario imparare i puntatori per diventare un perfetto programmatore Pascal. Cominciamo ad apprenderli in passaggi semplici e facili.
Come sapete, ogni variabile è una posizione di memoria e ogni posizione di memoria ha il suo indirizzo definito a cui è possibile accedere utilizzando il nome della variabile puntatore, che denota un indirizzo in memoria.
Cosa sono i puntatori?
Un puntatore è una variabile dinamica, il cui valore è l'indirizzo di un'altra variabile, cioè l'indirizzo diretto della posizione di memoria. Come qualsiasi variabile o costante, è necessario dichiarare un puntatore prima di poterlo utilizzare per memorizzare qualsiasi indirizzo di variabile. La forma generale di una dichiarazione di variabile puntatore è:
type
ptr-identifier = ^base-variable-type;
Il tipo di puntatore viene definito anteponendo alla freccia su del simbolo di accento circonflesso (^) il tipo di base. Il tipo di base definisce i tipi degli elementi di dati. Una volta che una variabile puntatore è definita di un certo tipo, può puntare solo elementi di dati di quel tipo. Una volta definito un tipo di puntatore, possiamo usare ilvar dichiarazione per dichiarare le variabili puntatore.
var
p1, p2, ... : ptr-identifier;
Di seguito sono riportate alcune dichiarazioni di puntatore valide:
type
Rptr = ^real;
Cptr = ^char;
Bptr = ^ Boolean;
Aptr = ^array[1..5] of real;
date-ptr = ^ date;
Date = record
Day: 1..31;
Month: 1..12;
Year: 1900..3000;
End;
var
a, b : Rptr;
d: date-ptr;
Le variabili del puntatore vengono dereferenziate utilizzando lo stesso simbolo di accento circonflesso (^). Ad esempio, la variabile associata a cui fa riferimento un puntatore rptr , è rptr ^ . È possibile accedervi come:
rptr^ := 234.56;
Il seguente esempio illustrerà questo concetto:
program exPointers;
var
number: integer;
iptr: ^integer;
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^);
end.
Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:
Number is: 100
iptr points to a value: 100
Number is: 200
iptr points to a value: 200
Stampa di un indirizzo di memoria in Pascal
In Pascal, possiamo assegnare l'indirizzo di una variabile a una variabile puntatore utilizzando l'operatore indirizzo (@). Usiamo questo puntatore per manipolare e accedere all'elemento dati. Tuttavia, se per qualche motivo dobbiamo lavorare con l'indirizzo di memoria stesso, dobbiamo memorizzarlo in una variabile di tipo parola.
Estendiamo l'esempio precedente per stampare l'indirizzo di memoria memorizzato nel puntatore iptr -
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.
Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:
Number is: 100
iptr points to a value: 100
Number is: 200
iptr points to a value: 200
45504
Puntatori NIL
È sempre una buona pratica assegnare un file NILvalore a una variabile puntatore nel caso in cui non si abbia l'indirizzo esatto da assegnare. Questo viene fatto al momento della dichiarazione della variabile. Un puntatore assegnatoNILpunta a nulla. Considera il seguente programma:
program exPointers;
var
number: integer;
iptr: ^integer;
y: ^word;
begin
iptr := nil;
y := addr(iptr);
writeln('the vaule of iptr is ', y^);
end.
Quando il codice precedente viene compilato ed eseguito, produce il seguente risultato:
The value of ptr is 0
Per verificare la presenza di un file nil puntatore puoi usare un'istruzione if come segue:
if(ptr <> nill )then (* succeeds if p is not null *)
if(ptr = nill)then (* succeeds if p is null *)
Pascal Pointers in Detail
I puntatori hanno molti ma semplici concetti e sono molto importanti per la programmazione Pascal. Di seguito sono riportati alcuni importanti concetti relativi ai puntatori, che dovrebbero essere chiari a un programmatore Pascal:
Suor n | Concetto e descrizione |
---|---|
1 |
Pascal - Puntatore aritmetico
Ci sono quattro operatori aritmetici che possono essere usati sui puntatori: incremento, decremento, +, - |
2 |
Pascal - Matrice di puntatori
È possibile definire array per contenere un numero di puntatori. |
3 |
Pascal - Puntatore al puntatore
Pascal ti permette di avere un puntatore su un puntatore e così via. |
4 |
Passaggio di puntatori a sottoprogrammi in Pascal
Il passaggio di un argomento per riferimento o per indirizzo consente entrambi di modificare l'argomento passato nel sottoprogramma chiamante dal sottoprogramma chiamato. |
5 |
Restituisce il puntatore da sottoprogrammi in Pascal
Pascal consente a un sottoprogramma di restituire un puntatore. |