Pointeur : une abstraction subtile
par
, 28/02/2016 à 11h20 (666 Affichages)
La notion de pointeur en programmation est un élément d'abstraction puissant mais difficile à comprendre et à manipuler. La plupart des tutoriels l'expliquent d'une façon simple mais peu compréhensible : « un pointeur est une variable particulière qui contient une adresse » ! et pire encore « le type du pointeur sera le type de l'objet pointé » ! Tout ce qu'il faut pour dégoûter l'apprenti programmeur.
Cette série d'articles tente de reprendre cette notion d'un point de vue différent disons « non conventionnel ».
Entrons dans le vif du sujet.
Vous savez ce qu'est une variable : c'est un contenant auquel on donne un nom et dont le contenu peut varier. Par exemple ma variable aura le nom suivant « prenom » et son contenu pourra être « max », « albert », « kevin » etc ou encore ma variable s'appellera « x » et pourra avoir toutes les valeurs numériques possibles ; de même deux autres variables s'appelleront « y » et « z », et pourront avoir également toutes les valeurs numériques possibles. Ainsi lorsque j'écrirai : z=x+y , ceci voudra dire que le contenu actuel de x est ajouté au contenu actuel de y et le résultat de cette addition deviendra le contenu de z.
Que se passe-t-il dans la machine ?
Toutes les données sont stockées de façon ordonnée, sinon on ne s'y retrouverait pas. Ainsi chaque donnée est repérée par une adresse, comme à la poste. Ou encore on peut imaginer une immense bibliothèque, où chaque livre est repéré par un numéro qui permet de savoir où il se trouve dans les étagères. Le livre est la « donnée » et le numéro « l'adresse » de la donnée. Ainsi dans notre ordinateur « x » est synonyme de « adresse » et cette « adresse » peut contenir la valeur « 4 », si à ce moment du déroulement du programme x vaut 4. « 4 » ici représente le livre située à l'adresse x de la bibliothèque.
Résumons simplement :
Quand vous donnez un nom à une variable, par exemple ici « x », vous ne faites rien d'autres que de donner un nom à une valeur numérique complexe qui, pour le compilateur, est une adresse précise. Dans un ordinateur il existe une très très longue série de numéros qui sont des adresses, et à chacune de ces adresses correspond un contenu : la valeur contenue à cette adresse. Ainsi pour le compilateur « x » désignera, une fois pour toutes et jusqu'à la fin du programme, une adresse donnée par exemple 3 640 933 dans un système qui contiendrait par exemple 10 millions d'adresses. Si le contenu de "x" peut changer, la valeur de l'adresse "x" ne le peut pas.
Jusqu'à la fin du programme « x » sera synonyme de « adresse 3 640 933 ». Ceci est FONDAMENTAL. Si vous ne l'avez pas compris et définitivement retenu, vous n'avez rien compris !
Par contre si vous l'avez bien compris, alors voyez maintenant toute la magie du pointeur : un pointeur est une sorte de variable qui peut « changer d'adresse ». C'est en quelque sorte une variable qui peut varier de deux façons. Non seulement comme pour "x" le contenu de la "variable pointée" pourra changer : on avait fait "x=4 et puis on fait "x=6" et alors "x" contient 6 ; mais l'adresse peut aussi changer : on décide maintenant que cette valeur 6 sera contenu ailleurs, à une autre adresse. C'est comme si « x » pouvez changer de nom, donc désigner, en cours de programme, une autre adresse.
A ce point de l'explication vous avez bien saisi ce qu'est une variable : « un nom équivalent à une adresse donnée » mais une variable qui change de nom, autrement dit un pointeur, cela vous semble un peu bizarre et obscur.
Retenez donc ceci puis passez à l'article suivant :
Une variable est un nom synonyme d'une adresse et cette adresse est fixe jusqu'à la fin du programme ; un pointeur est une variable CONTENANT une adresse que l'on peut changer durant le programme !