prems

Menu

le 09/04/2006 à 18:43

Le pointeur, cet incompris.

C'est peut-être un des éléments les plus essentiels, oserais-je dire élémentaires, de la programmation. Et c'est aussi ce qui donne toute sa puissance au langage C, entre autres bien sür.

Le pointeur est une variable qui contient une adresse en mémoire. Il est donc codé en 32 bits, voire 64 si la machine le supporte. On peut manipuler le pointeur comme n'importe quelle variable, l'incrémenter (ou plutôt le décaler), lui donner une valeur arbitraire, etc. Il faut savoir quand même que les pointeurs sont surveillés de près par le système, et que donc on ne pourra pas faire exactement ce qu'on veut : certaines adresses mémoires seront interdites.

En effet, un pointeur ne s'utilise pas tout seul. Il faut soit récupérer l'adresse d'une variable, soit allouer une partie de la mémoire au pointeur. On utilise pour ça une fonction spécifique (malloc en C par exemple).

Les principales confusions proviennent des notations utilisées. On écrit de la même façon la déclaration d'un pointeur, que l'utilisation de la valeur pointée par celui ci. C'est la fameuse "*". Alors que pour récupérer l'adresse d'une variable quelconque, on utilise le "&".

De même, la plupart du temps, les pointeurs se cachent. En déclarant un tableau de 30 chars (char tab[30];), on déclare en fait un pointeur "tab" sur un espace mémoire de 30 octets. Et la notation "[]" n'est en fait que le décalage de ce pointeur : *tab = tab[0] et tab = &(tab[0]).

Attention toutefois, le décalage d'un pointeur dépend de la taille en mémoire de ce qu'il pointe : un pointeur sur des entiers de 32 bits se décalera automatiquement de 4 octets.

Pourquoi utiliser des pointeurs ? Tout d'abord pour manipuler facilement des blocs de données. Pour passer un tableau dont la taille varie à une fonction. Aussi, quand on passe une variable en paramètre d'une fonction, celle-ci est incapable de la modifier. Par contre, si on passe un pointeur vers cette variable, la fonction pourra à la fois utiliser sa valeur, mais aussi la modifier.

On peut aussi prendre l'exemple d'une fonction qui modifie certaines valeurs d'un tableau, de façon itérative. Il suffit de décaler le pointeur vers le tableau en question. Ou alors, si on accède à certaines valeurs de différentes manières, il suffit de stocker un pointeur pour les retrouver, ce qui représente une grande économie d'espace mémoire. On peut très bien avoir une multitude de pointeurs vers les mêmes espaces mémoire.

Mais le plus grand avantage des pointeurs est sans doute que dans un système évolué, tout les périphériques sont "vus" comme des "parties" de la mémoire. Pour utiliser ma carte son, il me suffit d'aller écrire à l'espace mémoire qui lui est réservé. Je peux donc très facilement créer un programme utilisant un pointeur, que j'initialise au début avec la bonne adresse.

Ce qui nous amène au danger des pointeurs : ils permettent d'accéder à l'ensemble des fonctions de l'ordinateur. Certaines adresses "sensibles" sont bien sür protégées, mais on peut, quelquefois, dépasser les zones mémoires allouées aux pointeurs. Ce qui entraîne, généralement, une erreur, si le système est suffisamment robuste. Par contre, quand le système ne surveille pas la zone mémoire en question... on peut faire beaucoup de choses. C'est ce qu'on appelle communément une faille de sécurité.

Derniers articles

Validation XHTML Flux RSS 2.0 HFR at Home PHP 5 PostgreSQL Ubuntu Apache 2 A64