« Introduction au langage C/Pointeurs » : différence entre les versions
m Bot : Remplacement de texte automatisé (-<br/> +<br />); changement de type cosmétique |
→Présentation : Conseil de codage |
||
Ligne 19 : | Ligne 19 : | ||
::C'est l'opérateur de déréférencement. Il permet d'obtenir et donc de manipuler les données pointées par la variable ::''variable'' |
::C'est l'opérateur de déréférencement. Il permet d'obtenir et donc de manipuler les données pointées par la variable ::''variable'' |
||
::''*pointeur'' permet d'obtenir la valeur de la variable pointée par ''pointeur''. |
::''*pointeur'' permet d'obtenir la valeur de la variable pointée par ''pointeur''. |
||
Conseil de codage à respecter : [[b:Conseils de codage en C/Recherche des erreurs#Limiter l'utilisation des pointeurs (c_rec_13)|c_rec_13]]. |
|||
{{loupe|amorce=Voir aussi les pointeurs dans le WikiLivre |b:Programmation C/Pointeurs{{!}}Programmation C, chapitre Pointeurs}} |
{{loupe|amorce=Voir aussi les pointeurs dans le WikiLivre |b:Programmation C/Pointeurs{{!}}Programmation C, chapitre Pointeurs}} |
Version du 27 juin 2008 à 20:06
Présentation
Un pointeur est une variable qui contient l'adresse d'une autre variable.
La mémoire vive est découpée en un ensemble de cases, le plus souvent d'un octet (8 bits). Chaque case est identifiée par une adresse. Quand on déclare une variable, une ou plusieurs cases, en fonction du type de variable, sont alors réservées (allouées).
Quand on veut récupérer l'information contenue dans la mémoire, on utilise soit l'identifiant de la variable, soit son adresse qui correspond à la première case mémoire de l'allocation.
Chaque pointeur est « typé », c'est-à-dire qu'il pointe vers un type précis de variable.
- Déclaration
- type * identificateur;
- La variable identificateur est un pointeur vers une variable de type type.
- type * identificateur;
- L'opérateur &
- Il permet d'obtenir un pointeur vers une variable.
- &identificateur permet d'obtenir un pointeur vers la variable identificateur . Il renvoie en réalité une adresse mémoire, l'adresse où est stockée physiquement la variable identificateur. C'est donc une variable pointeur.
- Il permet d'obtenir un pointeur vers une variable.
- L'opérateur *
- * variable<br\>
- C'est l'opérateur de déréférencement. Il permet d'obtenir et donc de manipuler les données pointées par la variable ::variable
- *pointeur permet d'obtenir la valeur de la variable pointée par pointeur.
Conseil de codage à respecter : c_rec_13.
Déclaration de pointeur
int * entier; //Pointeur d'entier
char * caractere; //Pointeur de caractère
struct ELEM * e; //Pointeur e sur une structure de type ELEM
Affectation de l'adresse d'une variable
int entier; //Variable entière
int * ptINT; //Pointeur d'entier
entier = 15; //Affectation de valeur
ptINT = &entier; //Affectation d'adresse
(*ptINT)++; //Déréférencement et incrémentations de la valeur pointée.
(void)printf("%d\r\n",entier); // affiche 16
(void)printf("%d\r\n", *ptINT); // affiche 16
Le symbole '&' (et commercial) renvoie l'adresse d'une variable. Lorsqu'on met un '*' devant un pointeur on accède a la valeur pointée par ce pointeur.
Dangers liés aux pointeurs
Le problème
Les pointeurs ont énormément d'applications et permettent notamment l'accès à la totalité des zones de la mémoire, ce qui peut être dangereux car le programme pourrait lire ou écrire une zone qui ne correspond pas à la donnée souhaitée.
Les pointeurs sont aussi utilisés pour l'allocation mémoire qui est aussi un des points dangereux du langage.
L'utilisation de pointeurs peut conduire à des programmes incompréhensible pour des programmeurs habitués à d'autres langages.
Quelques causes possibles
- Utiliser un pointeur non initialisé ou ayant valeur nulle.
- Passer une valeur au lieu d'un pointeur à un fonction comme
scanf
.
Les conséquences
Les systèmes d'exploitations modernes limitent les dégâts dus à ces erreurs : dès qu'un programme commence à écrire chez le voisin, il est arrêté.
Par contre, rien ne vous empêche d'effectuer ces opérations dans votre espace d'adressage, ce qui aura souvent des effets désastreux : écrasement de zones mémoires et erreur d'exécution incompréhensibles survenant de nombreuses lignes plus loin dans le programme.
Les solutions
Ne pas abuser de l'usage des pointeurs. Dans le cas des tableaux et des chaines de caractères, préférer leur parcours en utilisant des indices entre crochets.
Les langage modernes comme Java ont abandonné le concept de pointeur et utilisent celui des références pour une question de sécurité.
TP