Tutoriel de programmation Linux C Partie 21 : Pointeurs de caractères, tableau de pointeurs et pointeur vers pointeur

Le concept des pointeurs est en effet l’un des concepts très importants du langage de programmation C. Jusqu’à présent, nous avons abordé plusieurs aspects des pointeurs en C. Dans ce tutoriel, nous aborderons quelques autres concepts de pointeurs.

Pointeurs de caractères, tableau de pointeurs et pointeur vers pointeur en C

Commençons par les pointeurs de caractères avec les lignes de code suivantes :

char p[] = "I like HowtoForge"
char *p = "I like HowToForge"

La première ligne définit un tableau ‘p’ dont la taille est égale au nombre de caractères entre guillemets. Mais la ligne suivante définit un pointeur ‘p’ qui pointe vers une constante de chaîne.

La différence ici est que le premier ‘p’ étant un tableau, tu peux facilement modifier ou changer le contenu du tableau. Mais comme le deuxième ‘p’ pointe vers une constante de chaîne, tu ne peux pas modifier le contenu de la chaîne.

Par exemple, le morceau de code suivant essaie de modifier une constante de chaîne :

#include <stdio.h>

int main()
{
char *p = "I like HowToForge";

p[0] = 'U';

return 0;
}

Et voici le résultat produit par ce code sur mon système :

Segmentation fault

Cette erreur suggère que l’exécution du programme s’est arrêtée brusquement, et ce parce que nous avons essayé de modifier quelque chose qui est constant.

N’oublie pas non plus que si le pointeur ‘p’ peut désigner une chaîne différente, tu ne peux pas modifier l’adresse de base du tableau ‘p’ (si tu te souviens bien, nous en avons déjà parlé dans l’un de nos précédents tutoriels).

Passons maintenant aux tableaux de pointeurs. Tout comme tu as vu des tableaux d’entiers, de caractères et d’autres types de tableaux, il peut aussi y avoir un tableau de pointeurs. Par exemple, le programme suivant définit un tableau ‘arr’ de pointeurs entiers et lui attribue des valeurs.

#include <stdio.h>

int main()
{
int *arr[3];
int a = 0, b = 1, c = 2;

arr[0] = &a;
arr[1] = &b;
arr[2] = &c;

return 0;
}

Note que les valeurs attribuées au tableau sont des adresses. C’est parce que ‘arr’ est un tableau de pointeurs, et que les pointeurs ne stockent rien d’autre que des adresses. Maintenant, si tu veux accéder aux valeurs conservées à ces adresses, tu devras utiliser l’opérateur *.

L’exemple suivant (qui n’est rien d’autre qu’une extension de l’exemple précédent) illustre cela :

#include <stdio.h>

int main()
{
int *arr[3];
int a = 0, b = 1, c = 2;

arr[0] = &a;
arr[1] = &b;
arr[2] = &c;

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

return 0;
}

Voici le résultat :

arr[0] is: 0 
arr[1] is: 1
arr[2] is: 2

Tout comme les tableaux de pointeurs d’entiers (comme celui dont nous avons parlé ici), tu peux avoir des tableaux stockant des pointeurs de caractères et plus encore.

Maintenant, passons aux pointeurs vers les pointeurs. Comme nous l’avons répété un certain nombre de fois jusqu’à présent, un pointeur stocke une adresse. Jusqu’à présent, dans cette série de tutoriels de programmation en C, nous n’avons vu qu’un pointeur pointant vers une variable non pointeur, mais le fait est que les pointeurs peuvent aussi pointer vers d’autres pointeurs.

Cela signifie qu’un pointeur peut stocker l’adresse d’un autre pointeur. Par exemple, voici un double pointeur ou un pointeur vers un pointeur :

int **ptr;

Voici un morceau de code qui utilise un double pointeur :

#include <stdio.h>

int main()
{
int *ptr;
int **p;

int a = 10;

ptr = &a;

p = &ptr;

printf("\n Pointer 'p' points to pointer 'ptr' which further points to value: %d", **p);

return 0;
}

Voici le résultat :

Pointer 'p' points to pointer 'ptr' which further points to value: 10

C’était donc un exemple de double pointeur. Dans le même ordre d’idées, tu peux avoir un pointeur vers un pointeur vers un pointeur, défini comme, par exemple, int ***ptr. Le nombre maximum de ces niveaux de ‘pointeur à pointeur à……’ dépend de l’implémentation (dans certains cas, la limite est de 12).

En pratique, cependant, tu ne rencontreras probablement que des pointeurs vers des pointeurs jusqu’au niveau trois, car avoir plus de niveaux rend la logique plus complexe à comprendre et à maintenir.

Conclusion

Nous avons abordé ici trois concepts importants liés aux pointeurs. Nous te conseillons d’essayer les exemples et les concepts dont nous avons parlé ici sur ton système pour avoir une meilleure idée de la façon dont ces choses fonctionnent. En cas de doute ou de question, envoie-nous un commentaire ci-dessous.

Vous aimerez aussi...