Tutoriel de programmation Linux C Partie 19 : Pointeurs et tableaux

Jusqu’à présent, dans cette série de tutoriels de programmation C en cours, nous avons brièvement abordé les bases des pointeurs. Il y a cependant plusieurs autres concepts liés aux pointeurs qui doivent être abordés. Dans ce tutoriel, nous allons donc aborder le concept des pointeurs et des tableaux.

Avant de commencer avec les pointeurs et les tableaux, rafraîchissons rapidement le concept de base des pointeurs. Les pointeurs sont un type spécial de variables qui peuvent contenir des adresses. Par exemple, un pointeur ‘ptr’ vers un caractère peut être déclaré de la manière suivante ;

char *ptr;

Et tu peux utiliser le signe de l’esperluette pour y stocker une adresse. Voici un exemple :

char c = 'a';
ptr = &c;

Donc maintenant, le pointeur ‘ptr’ contient l’adresse de la variable ‘c’. Sinon, tu peux aussi dire que ‘ptr’ pointe maintenant vers la variable ‘c’.

Pour accéder ou manipuler la valeur de la variable pointée par le pointeur, tu peux utiliser l’opérateur *. Par exemple, pour changer la valeur de la variable c de ‘a’ à ‘b’, tu peux utiliser le pointeur ‘ptr’ de la manière suivante :

*ptr = 'b';

Le programme suivant devrait te donner une meilleure idée des concepts de base des pointeurs dont nous avons parlé jusqu’à présent :

#include <stdio.h>

int main()
{
char c = 'a';
char *ptr = &c;

*ptr = 'b';

printf ("variable c = %c", c);

return 0;
}

Voici le résultat de ce programme :

variable c = b

Tu peux donc voir qu’en utilisant un pointeur, la valeur d’une variable a été modifiée.

Pointeurs et tableaux

Comme tu passeras de plus en plus de temps à écrire et lire du code C, tu observeras que les pointeurs et les tableaux sont souvent utilisés ensemble. Par exemple, tu peux accéder à des éléments individuels d’un tableau à l’aide d’un pointeur. Considère le morceau de code suivant :

...
...
...
char arr[] = {'a','b','c','d','e'}
char *ptr;
ptr = &arr[0]
...
...
...

Ici, le pointeur ‘ptr’ pointe vers le premier élément du tableau ‘arr’, qui, si tu parles en termes d’index, se trouve à la position zéro du tableau. Maintenant, tu peux utiliser l’opérateur * avec ‘ptr’ pour accéder/manipuler la valeur vers laquelle pointe le pointeur.

Une fois que tu as un pointeur qui pointe sur le premier élément d’un tableau, il est facile d’accéder aux autres éléments du tableau. Par exemple, si – dans le contexte de l’extrait de code ci-dessus – tu utilises l’expression suivante n’importe où :

*(ptr+1)

alors elle te permet d’accéder au deuxième élément du tableau, ce que tu fais généralement de la façon suivante :

arr[1] 

En fait, en ajoutant 1 à ‘ptr’, tu accèdes à l’adresse du prochain élément du tableau, et en utilisant *, tu peux accéder à la valeur stockée à cette adresse. De même, en ajoutant 2, tu accèdes au troisième élément … et ainsi de suite.

Voici un programme qui devrait te donner une idée plus claire de ce dont nous venons de parler :

#include <stdio.h>

int main()
{
char arr[] = {'a','b','c','d','e'};
char *ptr = &arr[0];

for(int i=0;i<strlen(arr);i++)
printf ("arr[%d] is %c \n", i, *(ptr+i));

return 0;
}

Et voici le résultat :

arr[0] is a 
arr[1] is b
arr[2] is c
arr[3] is d
arr[4] is e

Comme tu peux le voir, l’expression ‘*(ptr+i)’ – avec i variant de 0 au dernier indice du tableau – nous a permis d’accéder à tous les éléments du tableau.

REMARQUE 1: Le nom du tableau, lorsqu’il est utilisé dans le code, te donne l’adresse de base du tableau. Cela signifie que le nom du tableau et l’adresse de son premier élément sont une seule et même chose. Ainsi, dans le contexte d’un tableau, ‘arr’, ‘&arr[0]’ et ‘arr’ sont une seule et même chose. Cela s’applique également aux autres éléments, ce qui signifie que &arr[2] peut aussi être écrit (arr+2) et ainsi de suite.

NOTE 2: En prolongement de ce que nous avons discuté dans la note ci-dessus, chaque représentation d’élément de tableau peut être décomposée en représentation de pointeur. Par exemple : arr[2] est équivalent à ‘*(arr + 2)’.

NOTE 3: Bien que tu puisses assigner une adresse de tableau à un pointeur, l’inverse n’est pas valable. De même, contrairement aux pointeurs, tu ne peux pas utiliser les opérateurs ++ ou — avec le nom d’un tableau. De manière générale, tu ne peux pas modifier les adresses auxquelles les éléments du tableau sont situés à l’origine.

Conclusion

Ce tutoriel s’est concentré sur le concept de pointeur et de tableau, sur la façon dont ils sont liés et sur la façon dont on peut accéder aux éléments d’un tableau grâce aux pointeurs. Vers la fin, nous avons également discuté de certains points importants lorsqu’il s’agit de code qui utilise des pointeurs vers des tableaux.

Essaie ces concepts localement sur ta machine pour avoir une meilleure idée de la façon dont ces choses fonctionnent, et en cas de doute ou de question, laisse un commentaire ci-dessous.

Vous aimerez aussi...