|
|
|
|
TUTORIEL ALGO/METHODES |
|
|
|
Expliquez-moi... Les pointeurs |
Compréhension et reconnaissance de cette fonctionnalité indispensable de certains langages, en particulier C et C++.
(20/09/2005) |
|
L'étude des pointeurs correspond
souvent au stade où les apprentis développeurs lâchent prise,
et préfèrent s'en remettre à des langages qui dissimulent leur
gestion, voire l'intégralité de la gestion-mémoire. Il est vrai
que réfléchir en terme de pointeur exige parfois quelques jonglages
intellectuels pour se sortir des adresses-mémoires, des
variables, et des variables qui pointent vers des variables...
|
Forum |
|
Réagissez
dans les forums
de JDN Développeurs
|
Ramené au dénominateur commun, un pointeur se définit comme
suit : c'est une variable qui contient l'adresse en mémoire
d'une autre variable. Jusqu'ici, cela reste accessible :
une variable est stockée en mémoire, et sa position en mémoire
est définie par une adresse précise. Cette adresse peut être
traitée au moyen d'un pointeur, à savoir une variable contenant
cette adresse.
Une variable de cette sorte fait donc référence à une autre
variable en mémoire. L'action de récupérer cette autre variable
par le biais de la variable-pointeur s'appelle "déréférencer"
le pointeur.
Les pointeurs
sont surtout utilisés dans les programmes écrits en C et C++,
et bien sûr en assembleur. D'autres langages les utilisent également,
sous une forme plus ou moins protégée : Pascal, C#, Fortran,
Ada, Modula-2, Oberon.
Java est réputé par exemple pour ne pas utiliser les pointeurs,
mais ne fait en fait que les dissimuler au développeurs aux
travers de références. Cela se vérifie avant l'affichage d'une
exception NullPointerException
: les pointeurs sont très présents en Java, mais implicites
- on ne peut pas les manipuler directement.
Reste qu'en surface, l'intérêt peut sembler limité pour une
telle complexité. D'autres peuvent arguer qu'un langage moderne
n'a aucun intérêt à compliquer la tâche d'un développeur, et
devrait cacher ce genre de détails qui le divertissent de sa
tâche principale : construire une application qui marche. C'est
mal connaître les capacités et avantages des pointeurs.
Les pointeurs sont la clef d'une grande flexibilité pour les
langages assez bas-niveau comme C et C++. Utilisés en combinaison
avec des tableaux ou des fonctions (voire des structures complètes),
ils peuvent, bien manipulés, permettre de construire un code
compact et efficace.
Pour commencer, le passage des paramètres en C se fait par valeur
(et non par référence). De fait, les pointeurs sont le seul
moyen de modifier le contenu des variables déclarées dans d'autres
fonctions. Les pointeurs rendent donc possibles le traitement
des tableaux et des chaînes dans des fonctions, ainsi que le
renvoi de plusieurs valeurs par une fonction.
Autres usages obligeant à l'utilisation du pointeur : le tableau,
dont le nom est un pointeur sur son premier élément. Enfin,
plus généralement, il permet de construire des structures dynamiques
(dont la taille peut évoluer au cours du temps).
|
Forum |
|
Réagissez
dans les forums
de JDN Développeurs
|
Il est donc important de savoir au moins comprendre et reconnaître
des pointeurs dans un code source. En C, ils se signalent par
deux opérateurs : & pour obtenir
l'adresse en mémoire d'une variable, et *
pour accéder au contenu d'une adresse-mémoire.
main() {
//x contient la valeur 10
short x = 10;
// y contient la valeur 100
short y = 100;
// P est un pointeur, référençant une adresse contenant un short
short *P;
// P pointe vers l'adresse de x
P = &x;
// y contient le contenu de x (via P)
y = *P;
// x contient la valeur 1000 (via P)
*P = 1000;
return 0;
}
Les pointeurs peuvent prendre d'autres formes, parfois bien
plus compliquées. Cette présentation devrait vous sortir des
variantes les plus courantes. |
|
|
|
|
|
Quand achetez-vous le plus en ligne ? |
|
|
|
|
|
|
|
|