Tutoriel de programmation Linux C Partie 20 – Arithmétique de l’adresse du pointeur

Dans notre précédent tutoriel de cette série continue sur la programmation C, nous avons discuté des pointeurs de manière assez détaillée. Pour prolonger cette discussion, nous voici avec d’autres concepts dignes d’intérêt liés aux pointeurs. Alors sans plus attendre, commençons.

Arithmétique des adresses de pointeurs en C

Tout d’abord, concentrons-nous sur l’arithmétique d’adresse lorsque nous traitons des pointeurs. Comme nous l’avons vu dans notre précédent tutoriel, si tu as un pointeur qui pointe vers un tableau (disons le début de celui-ci), il est très facile d’accéder aux éléments de ce tableau. Voici un exemple :

#include <stdio.h>

int main()
{
char arr[]={'a','b','c','d'};
int a[]={1,2,3,4};

char *ptr = arr;
int *p = a;

for(int i=0; i<sizeof(arr); i++)
{
printf("\n Character pointer pointing to %u, with value %c", ptr, *ptr);
ptr++;
}

for(int i=0; i<(sizeof(a)/sizeof(int)); i++)
{
printf("\n Integer pointer pointing to %u, with value %d", p, *p);
p++;
}

return 0;
}

Dans ce code, nous avons deux tableaux – ‘arr’ et ‘a’. Alors que le premier est un tableau de caractères, le second est un tableau d’entiers. Nous avons ensuite deux pointeurs qui pointent vers ces tableaux – ‘ptr’ et ‘p’, respectivement. Ensuite, il y a deux boucles ‘for’ dans lesquelles nous imprimons l’adresse actuelle vers laquelle pointe le pointeur et la valeur contenue à cette adresse.

Voici le résultat de ce code sur ma machine :

 Character pointer pointing to 726409312, with value a 
Character pointer pointing to 726409313, with value b
Character pointer pointing to 726409314, with value c
Character pointer pointing to 726409315, with value d
Integer pointer pointing to 726409296, with value 1
Integer pointer pointing to 726409300, with value 2
Integer pointer pointing to 726409304, with value 3
Integer pointer pointing to 726409308, with value 4

Ce qui est intéressant ici, ce sont les adresses imprimées dans le résultat. Pour un tableau de caractères, l’ajout de ‘1’ au pointeur l’a incrémenté jusqu’à l’adresse suivante, mais pour un tableau d’entiers, l’ajout de ‘1’ au pointeur l’a fait sauter de 4 adresses. Pourquoi en est-il ainsi ?

Eh bien, tout dépend du type de pointeur. Un pointeur de caractère saute toujours le nombre d’octets qu’occupe un caractère, ce qui est généralement 1. De même, un pointeur vers un nombre entier saute généralement 4 octets lorsqu’il est incrémenté de 1. Cela devrait donc expliquer la différence entre les sauts des pointeurs de caractères et de nombres entiers dans le résultat ci-dessus.

Pour continuer avec l’arithmétique des pointeurs, les pointeurs peuvent être utilisés dans des expressions de comparaison dans certains cas. Par exemple, si tu veux confirmer si un pointeur ‘ptr’ pointe ou non vers un élément d’un tableau ‘arr’ (de taille ‘size’), tu peux effectuer la comparaison de la manière suivante :

if((ptr >= arr) && (ptr < (arr + size))) 

En fait, l’expression ci-dessus vérifie si l’adresse détenue par le pointeur correspond ou non à l’un de ses éléments.

De plus, si plusieurs pointeurs pointent vers des éléments du même tableau, tu peux utiliser les opérateurs de comparaison suivants : ==, !=, <, et >=. En fait, tu peux aussi effectuer une soustraction de pointeur dans ces cas-là. Voici un exemple :

#include <stdio.h>

int main()
{
char arr[]= "Welcome to HowtoForge";

char *ptr = arr;
char *p = arr;

while(*p != '\0')
{
p++;
}

printf("\n Length of the string is %d", (p - ptr));

return 0;
}

Dans ce programme, nous nous sommes assurés qu’un pointeur pointe vers le premier élément du tableau, tandis que le deuxième pointeur est continuellement incrémenté jusqu’à ce qu’il pointe vers le dernier élément (qui est ‘\0’ dans les chaînes constantes).

Ensuite, étant donné que nous avons affaire à des caractères (qui occupent un octet chacun), en soustrayant l’adresse pointée par le premier pointeur de celle pointée par le deuxième pointeur, nous pouvons trouver le nombre de caractères, qui, comme tu le vois, est la longueur exacte de la chaîne.

REMARQUE: N’oublie pas que les opérations comme l’addition, la multiplication, la division et autres ne sont pas valables lorsqu’il s’agit de pointeurs. De plus, les opérations acceptables que nous avons énumérées jusqu’à présent ne sont également valables que lorsque les pointeurs sont du même type et qu’ils pointent vers des éléments du même tableau.

Conclusion

Après avoir abordé les concepts de base des pointeurs dans le tutoriel précédent, nous avons approfondi le concept des pointeurs en abordant ici l’arithmétique des adresses de pointeurs. Nous te suggérons de mettre en pratique tout ce dont nous avons parlé ici sur ta machine sous forme de programmes. Et si tu as un doute ou une question, n’hésite pas à laisser un commentaire ci-dessous.

Vous aimerez aussi...