Ecrit par Nathanaël Cherrier

Les pointeurs en C/C++

Publié dans , ,

Partagez l'article

twitter facebook

Les pointeurs semblent être la bête noire des étudiants en première année des écoles d'ingénieur/de programmation. Pourtant ils n'ont vraiment rien de bien compliqué. Je vais essayer de vous apporter quelques éléments supplémentaires dans l'espoir de vous aider à maîtriser les fameux pointeurs.

J'ai récemment donné cours à un jeune pour le préparer à ses rattrapages en langage C et C++. Son problème ? Les pointeurs. Et je me suis rappelé à quel point beaucoup galéraient à mon époque aussi.

Voilà pourquoi un article sur le C++ apparaît tout à coup au milieu des articles conventionnels de ce blog. Je veux vous aider à passer le cap des pointeurs. Et puis, même si vous utilisez et préférer des langages où ils n'existent pas, je pense que vous gagnerez à comprendre un peu plus comment fonctionne la mémoire de votre machine.

Dans cet article, vous apprendrez :

  • Ce qu'est un pointeur
  • Comment les utiliser
  • A quoi il servent

Qu'est ce qu'une variable ?

Nous allons commencer par décrire une variable car je suis intimement convaincu que cela vous sera utile pour la suite de l'apprentissage. Cette description n'est volontairement pas exacte pour permettre une certaine abstraction. J'ai aussi écrit un autre article qui vous permettra d'approfondir les variables, de découvrir quelques bonnes pratiques à leur sujet ou comparer comment nous les utilisons dans d'autres langage.

Une variable est une zone mémoire dans votre ordinateur où vous êtes autorisé à stocker une valeur quelconque. Elle possède une adresse pour que nous puissions la retrouver et un nom pour que les humains n'aient pas besoin de retenir son adresse. Une variable possède un type pour indiquer au système comment interagir avec la valeur.

int variable = 10;

En C/C++, nous déclarons une variable en écrivant <type> <nom> = <valeur>. L'attribution de l'adresse mémoire est faite automatiquement par le système. Dans le cas d'une création de variable classique, le développeur n'a pas à se soucier de l'adresse mémoire.

Nous pouvons imaginer la mémoire de notre ordinateur comme une bibliothèque géante où sont stockées énormément d'informations. Pour les retrouver facilement, nous décidons d'attribuer à chaque emplacement une adresse unique.

Lorsque nous exécutons le code ci-dessus, nous voulons stocker dans la bibliothèque le livre variable qui contient le nombre entier 10. Le bibliothécaire (le système d'exploitation) nous indique où le ranger. Disons à l'adresse 0x2020.

Ainsi, lorsque nous auront besoin de savoir ce que contient le livre variable nous n'aurons qu'à aller à l'adresse 0x2020 pour trouver le nombre entier 10.

Qu'est ce qu'un pointeur ?

Pour bien comprendre ce qu'est un pointeur, il faut que nous nous répétions — au moins jusqu'a ce que ce soit logique pour nous — que ce n'est qu'une simple variable.

int* pointeur = &variable;

En effet, la seule réelle différence est que la valeur d'un pointeur est l'adresse mémoire d'une autre variable. Pourquoi donc les * et & qui s'ajoutent à la déclaration de la variable ?

printf("%d", variable); // 10
printf("%d", &variable); // 0x2020
Affichage de la valeur avec et sans &

Le symbole & sert à indiquer que nous voulons récupérer l'adresse d'une variable au lieu de sa valeur. Rappelons que nous voulons stocker l'adresse d'une variable dans un pointeur et non copier sa valeur.

Le symbole * ne sert qu'à indiquer que l'on travaille avec un pointeur. Le but est de permettre d'adapter le comportement lorsqu'il s'agit d'un pointeur ou d'une valeur. On expliquera cela un peu plus loin.

Si nous reprenons l'exemple de la bibliothèque, avoir un pointer c'est avoir un emplacement ou un livre qui contient comme valeur l'adresse d'un autre livre, d'un autre emplacement.

Pour récupérer une valeur à partir d'un pointeur, il nous faut aller à l'adresse du livre pointeur, disons 0x3096, dans ce livre la valeur que nous pouvons lire est 0x2020. Grâce au symbole * nous savons qu'il s'agit en fait d'un pointeur et donc que sa valeur est l'adresse d'une autre variable. Nous allons donc à l'adresse 0x2020 pour découvrir que la valeur inscrite dans ce livre est le nombre entier 10.

L'exemple de la bibliothèque peut sembler simpliste mais il permet de plus facilement se représenter la mémoire de votre ordinateur et comprendre comment elle fonctionne. Vous pouvez remplacer la bibliothèque par ce que vous voulez: un énorme tableau avec des cases numérotées, un placard avec des tiroirs numérotés. Le but est de remplacer une notion abstraite (la mémoire de l'ordinateur) par quelque chose de concret, réel et que vous connaissez déjà (bibliothèque, placard, tableau, etc)

À quoi servent les pointeurs ?

Maintenant que nous savons ce que sont les pointeurs et comment ils fonctionnent, une question reste en suspend : à quoi servent les pointeurs ? Pourquoi aurions-nous besoins d'eux ?

Les pointeurs sont utiles à plusieurs choses. Tout d'abord, comme ils font référence à d'autres variables en mémoire, ils nous permettent d'avoir accès à une même variable à différents endroits du programme.

void reaction(int* arg) {
	*arg = 1;
}

int action() {
   	int nombre = 0;
   
   	reaction(&nombre);
   
   	if (nombre == 0) {
   		return 1;
    }
    
    return 0
}
Les pointeurs nous permettent d'avoir accès dans reaction() à une variable créée dans action()

Bien-sûr, il s'agit d'un accès en écriture. Le pointeur n 'est pas une copie de la variable mais une référence vers celle-ci.

Les pointeurs permettent aussi de réduire le temps d'exécution et la place utilisée en mémoire par un programme. En effet, comme les variables ne sont plus dupliquées dans chaque contexte d'exécution, nous n'utilisons plus autant d'espace mémoire.

Il existe aussi des pointeurs sur des fonctions, mais ce sera sûrement pour un prochain article. En tout cas, si vous avez compris tout ce que l'on vient de se dire, je pense que vous avez les connaissances nécessaires pour facilement comprendre tout ce qu'il reste à savoir sur les pointeurs par vous-même.

Si vous avez des questions ou des remarques/conseils, n'hésitez pas à en discuter avec les autres membres du forum (zone de commentaires plus bas)! Et si vous aimez l'article, n'oubliez pas de le partager avec vos amis. Vous pouvez aussi soutenir le blog sur Patreon.