Pascal - Arithmétique du pointeur

Comme expliqué dans le chapitre principal, le pointeur Pascal est une adresse, qui est une valeur numérique stockée dans un mot. Par conséquent, vous pouvez effectuer des opérations arithmétiques sur un pointeur comme vous le pouvez sur une valeur numérique. Il existe quatre opérateurs arithmétiques qui peuvent être utilisés sur les pointeurs: incrémenter, décrémenter, + et -.

Pour comprendre l'arithmétique du pointeur, considérons que ptr est un pointeur entier, qui pointe vers l'adresse 1000. En supposant des entiers 32 bits, effectuons l'opération d'incrémentation sur le pointeur -

Inc(ptr);

Maintenant, après l'opération ci-dessus, le ptr pointera vers l'emplacement 1004 car à chaque fois ptrest incrémenté, il pointera vers l'emplacement entier suivant, qui est de 4 octets à côté de l'emplacement actuel. Cette opération déplacera le pointeur vers l'emplacement de mémoire suivant sans affecter la valeur réelle à l'emplacement de mémoire. Siptr pointe vers un caractère, dont l'adresse est 1000, alors l'opération ci-dessus pointera vers l'emplacement 1001 car le caractère suivant sera disponible à 1001.

Incrémenter un pointeur

Nous préférons utiliser un pointeur dans notre programme au lieu d'un tableau car le pointeur de variable peut être incrémenté, contrairement au nom du tableau, qui ne peut pas être incrémenté car il s'agit d'un pointeur constant. Le programme suivant incrémente le pointeur de variable pour accéder à chaque élément suivant du tableau -

program exPointers;
const MAX = 3;
var
   arr: array [1..MAX] of integer = (10, 100, 200);
   i: integer;
   iptr: ^integer;
   y: ^word;

begin
   (* let us have array address in pointer *)
   iptr := @arr[1];
   
   for  i := 1 to MAX do
   begin
      y:= addr(iptr);
      writeln('Address of arr[', i, '] = ' , y^ );
      writeln(' Value of arr[', i, '] = ' , iptr^ );
      
      (* move to the next location *)
      inc(iptr);
   end;
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Address of arr[1] = 13248
 Value of arr[1] = 10
Address of arr[2] = 13250
 Value of arr[2] = 100
Address of arr[3] = 13252
 Value of arr[3] = 200

Décrémenter un pointeur

Les mêmes considérations s'appliquent à la décrémentation d'un pointeur, qui diminue sa valeur du nombre d'octets de son type de données comme indiqué ci-dessous -

program exPointers;
const MAX = 3;
var
   arr: array [1..MAX] of integer = (10, 100, 200);
   i: integer;
   iptr: ^integer;
   y: ^word;

begin
   (* let us have array address in pointer *)
   iptr := @arr[MAX];
   
   for  i := MAX downto 1 do
   begin
      y:= addr(iptr);
      writeln('Address of arr[', i, '] = ' , y^ );
      writeln(' Value of arr[', i, '] = ' , iptr^ );

      (* move to the next location *)
      dec(iptr);
   end;
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Address of arr[3] = 13252
 Value of arr[3] = 200
Address of arr[2] = 13250
 Value of arr[2] = 100
Address of arr[1] = 13248
 Value of arr[1] = 10

Comparaisons de pointeurs

Les pointeurs peuvent être comparés à l'aide d'opérateurs relationnels, tels que =, <et>. Si p1 et p2 pointent vers des variables qui sont liées les unes aux autres, telles que des éléments du même tableau, alors p1 et p2 peuvent être comparés de manière significative.

Le programme suivant modifie l'exemple précédent en incrémentant le pointeur de variable tant que l'adresse vers laquelle il pointe est inférieure ou égale à l'adresse du dernier élément du tableau, qui est @arr [MAX] -

program exPointers;
const MAX = 3;
var
   arr: array [1..MAX] of integer = (10, 100, 200);
   i: integer;
   iptr: ^integer;
   y: ^word;

begin
   i:=1;
   
   (* let us have array address in pointer *)
   iptr := @arr[1];
   
   while (iptr <= @arr[MAX]) do
   begin
      y:= addr(iptr);
      writeln('Address of arr[', i, '] = ' , y^ );
      writeln(' Value of arr[', i, '] = ' , iptr^ );
      
      (* move to the next location *)
      inc(iptr);
      i := i+1;
   end;
end.

Lorsque le code ci-dessus est compilé et exécuté, il produit le résultat suivant -

Address of arr[1] = 13248
 Value of arr[1] = 10
Address of arr[2] = 13250
 Value of arr[2] = 100
Address of arr[3] = 13252
 Value of arr[3] = 200