Pascal - Ponteiros
Os ponteiros em Pascal são fáceis e divertidos de aprender. Algumas tarefas de programação Pascal são realizadas mais facilmente com ponteiros, e outras tarefas, como alocação de memória dinâmica, não podem ser executadas sem o uso de ponteiros. Portanto, é necessário aprender ponteiros para se tornar um programador Pascal perfeito. Vamos começar a aprendê-los em etapas simples e fáceis.
Como você sabe, cada variável é um local da memória e cada local da memória tem seu endereço definido, que pode ser acessado usando o nome da variável de ponteiro, que denota um endereço na memória.
O que são ponteiros?
Um ponteiro é uma variável dinâmica, cujo valor é o endereço de outra variável, ou seja, o endereço direto da localização da memória. Como qualquer variável ou constante, você deve declarar um ponteiro antes de usá-lo para armazenar qualquer endereço de variável. A forma geral de uma declaração de variável de ponteiro é -
type
ptr-identifier = ^base-variable-type;
O tipo de ponteiro é definido prefixando a seta para cima do símbolo circunflexo (^) com o tipo base. O tipo base define os tipos dos itens de dados. Depois que uma variável de ponteiro é definida para ser de certo tipo, ela pode apontar itens de dados apenas desse tipo. Uma vez que um tipo de ponteiro foi definido, podemos usar ovar declaração para declarar variáveis de ponteiro.
var
p1, p2, ... : ptr-identifier;
A seguir estão algumas declarações de ponteiro válidas -
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;
As variáveis de ponteiro são referenciadas usando o mesmo símbolo circunflexo (^). Por exemplo, a variável associada referida por um ponteiro rptr , é rptr ^ . Ele pode ser acessado como -
rptr^ := 234.56;
O exemplo a seguir ilustrará este conceito -
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 o código acima é compilado e executado, ele produz o seguinte resultado -
Number is: 100
iptr points to a value: 100
Number is: 200
iptr points to a value: 200
Imprimir um endereço de memória em Pascal
Em Pascal, podemos atribuir o endereço de uma variável a uma variável de ponteiro usando o operador de endereço (@). Usamos este ponteiro para manipular e acessar o item de dados. No entanto, se por algum motivo, precisamos trabalhar com o próprio endereço de memória, precisamos armazená-lo em uma variável do tipo palavra.
Vamos estender o exemplo acima para imprimir o endereço de memória armazenado no ponteiro 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 o código acima é compilado e executado, ele produz o seguinte resultado -
Number is: 100
iptr points to a value: 100
Number is: 200
iptr points to a value: 200
45504
Ponteiros NIL
É sempre uma boa prática atribuir um NILvalor para uma variável de ponteiro no caso de você não ter o endereço exato a ser atribuído. Isso é feito no momento da declaração da variável. Um ponteiro que é atribuídoNILaponta para lugar nenhum. Considere o seguinte programa -
program exPointers;
var
number: integer;
iptr: ^integer;
y: ^word;
begin
iptr := nil;
y := addr(iptr);
writeln('the vaule of iptr is ', y^);
end.
Quando o código acima é compilado e executado, ele produz o seguinte resultado -
The value of ptr is 0
Para verificar se há um nil ponteiro, você pode usar uma instrução if da seguinte maneira -
if(ptr <> nill )then (* succeeds if p is not null *)
if(ptr = nill)then (* succeeds if p is null *)
Ponteiros Pascal em detalhes
Os ponteiros têm muitos conceitos fáceis e são muito importantes para a programação Pascal. Seguem alguns conceitos importantes de ponteiro, que devem ser claros para um programador Pascal -
Sr. Não | Conceito e descrição |
---|---|
1 | Pascal - Pointer aritmética Existem quatro operadores aritméticos que podem ser usados em ponteiros: incremento, decremento, +, - |
2 | Pascal - matriz de ponteiros Você pode definir matrizes para conter uma série de ponteiros. |
3 | Pascal - Ponteiro para ponteiro Pascal permite que você tenha um ponteiro sobre um ponteiro e assim por diante. |
4 | Passando ponteiros para subprogramas em Pascal Passar um argumento por referência ou por endereço permite que o argumento passado seja alterado no subprograma de chamada pelo subprograma chamado. |
5 | Ponteiro de retorno de subprogramas em Pascal Pascal permite que um subprograma retorne um ponteiro. |