Manuel de suivi dynamique Solaris

Arithmétique de pointeur

Les pointeurs n'étant que des entiers utilisés comme des adresses d'autres objets en mémoire, D propose un ensemble de fonctions permettant d'exécuter une arithmétique sur des pointeurs. L'arithmétique de pointeur n'est cependant pas identique à l'arithmétique d'entier. L'arithmétique de pointeur définit implicitement l'adresse sous-jacente en multipliant ou en divisant les opérandes par la taille du type référencé par le pointeur. Le fragment D suivant illustre cette propriété :

int *x;

BEGIN
{
	trace(x);
	trace(x + 1);
	trace(x + 2);
}

Ce fragment crée un pointeur entier x, puis suit sa valeur, incrémentée de un, et sa valeur incrémentée de deux. Si vous créez et exécutez ce programme, DTrace signale les valeurs d'entier 0, 4 et 8.

x étant un pointeur sur un entier (4 octets), l'incrémentation de x ajoute 4 à la valeur de pointeur sous-jacente. Cette propriété est utile en cas d'utilisation de pointeur pour faire référence à des emplacements de stockage consécutifs comme des ensembles. Par exemple, si x était affecté à l'adresse d'un tableau a, similaire à celui illustré dans la Figure 5–2, l'expression x + 1 serait équivalente à l'expression &a[1]. De même, l'expression *(x + 1) ferait référence à la valeur a[1]. L'arithmétique de pointeur est mise en œuvre par le compilateur D si une valeur de pointeur est incrémentée à l'aide de l'opérateur +=, + ou ++.

L'arithmétique de pointeur s'applique également lorsqu'un entier est soustrait d'un pointeur à gauche, lorsqu'un pointeur est soustrait d'un autre pointeur ou lorsque l'opérateur -- est appliqué à un pointeur. Par exemple, le programme D suivant suivrait le résultat 2 :

int *x, *y;
int a[5];

BEGIN
{
	x = &a[0];
	y = &a[2];
	trace(y - x);
}