« Programmation C++/Les pointeurs » : différence entre les versions

Un livre de Wikilivres.
Contenu supprimé Contenu ajouté
Ligne 44 : Ligne 44 :


'''Explications : '''
'''Explications : '''
*dans ce programme, on déclare 3 variables a, b et c. On déclare ensuite 2 pointeurs vers des entiers x et y.
* Dans ce programme, on déclare 3 variables a, b et c. On déclare ensuite 2 pointeurs vers des entiers x et y.
* a est initialisé à 98 et b à 78.
* a est initialisé à 98 et b à 78.
*''x=&a;'' permet de mettre dans x l'adresse de a. x est désormais un pointeur vers a.<br/>
* <code>x=&a;</code> permet de mettre dans x l'adresse de a. x est désormais un pointeur vers a.
*''*x'' est la valeur de la variable pointée par x, c'est-à-dire la valeur de a, et vaut donc 98.
* <code>*x</code> est la valeur de la variable pointée par x, c'est-à-dire la valeur de a, et vaut donc 98.
''c=*x+5;'' permet donc de tranférer 98+5 donc 103 dans la variable c.
:<code>c=*x+5;</code> permet donc de tranférer 98+5 donc 103 dans la variable c.
*''y=&b'' permet de mettre dans y l'adressee la variable b. y est désormais un pointeur vers b.<br/>
*<code>y=&b</code> permet de mettre dans y l'adressee la variable b. y est désormais un pointeur vers b.<br/>
a+10 vaut 98+10 donc 108.<br/>
:a+10 vaut 98+10 donc 108.
''*y=a+10;'' permet de tranférer dans la variable pointée par y la valeur de a+10, c'est-à-dire 108. On transfère donc 108 dans b.
*<code>*y=a+10;</code> permet de tranférer dans la variable pointée par y la valeur de a+10, c'est-à-dire 108. On transfère donc 108 dans b.
* on affiche ensuite les valeurs de b et c c'est à dire respectivement 108 et 103.
* on affiche ensuite les valeurs de b et c c'est à dire respectivement 108 et 103.


<br/>


===Opérations arithmétiques sur les pointeurs===
===Opérations arithmétiques sur les pointeurs===

Version du 12 juillet 2006 à 12:44

Les pointeurs

Un pointeur désigne une variable contenant une adresse mémoire. Il est utilisé lorsque l'on veut manipuler les données stockées à cette adresse. C'est donc un moyen indirect de construire et de manipuler des données très souvent complexes.

Déclaration

type * identificateur;
La variable identificateur est un pointeur vers une variable de type type.

L'opérateur &

Il permet d'obtenir un pointeur vers une variable.
&identificateur permet d'obtenir un pointeur vers la variable identificateur. Il renvoit en réalité une adresse mémoire, l'adresse où est stocké physiquement la variable identificateur. C'est donc une variable pointeur.

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.

Exemple de programme

 #include <iostream>
 using namespace std;
 
 int main()
 {
     int a, b, c;
     int *x, *y;
 
     a = 98;
     b = 108;
 
     x = &a;
     c = *x + 5;
 
     y = &b;
     *y = a + 10;
 
     cout << "La variable b vaut : " << b << endl;
     cout << "La variable c vaut : " << c << endl;
 
     return 0;
 }

Exécution :
La variable b vaut 108
La variable c vaut 103

Explications :

  • Dans ce programme, on déclare 3 variables a, b et c. On déclare ensuite 2 pointeurs vers des entiers x et y.
  • a est initialisé à 98 et b à 78.
  • x=&a; permet de mettre dans x l'adresse de a. x est désormais un pointeur vers a.
  • *x est la valeur de la variable pointée par x, c'est-à-dire la valeur de a, et vaut donc 98.
c=*x+5; permet donc de tranférer 98+5 donc 103 dans la variable c.
  • y=&b permet de mettre dans y l'adressee la variable b. y est désormais un pointeur vers b.
a+10 vaut 98+10 donc 108.
  • *y=a+10; permet de tranférer dans la variable pointée par y la valeur de a+10, c'est-à-dire 108. On transfère donc 108 dans b.
  • on affiche ensuite les valeurs de b et c c'est à dire respectivement 108 et 103.

Opérations arithmétiques sur les pointeurs

Hormis l'opérateur de déréférencement, les pointeurs peuvent être utilisés avec l'opérateur d'addition ( + ). L'addition d'un pointeur avec une valeur entière permet d'avancer ou reculer le pointeur du nombre d'éléments indiqué.

Exemple 1

 char* ptr="Pointeur";  // ptr pointe le premier caractère de la chaîne de caractères
 
 cout << ptr << endl;   // affiche "Pointeur"
 
 ptr = ptr+3;
 cout << ptr << endl;   // affiche "nteur"
 
 cout << ++ptr << endl;   // affiche "teur"
 cout << --ptr << endl;   // affiche "nteur"

Comme l'exemple précédent le montre, il est également possible d'utiliser les opérateurs d'incrémentation et de décrémentation.

Exemple 2

 int premiers[] = { 2, 3, 5, 7, 11, 13, 17 };
 int* ptr = premiers; // pointe le premier élément du tableau
 
 cout << hex << ptr << endl;  // affiche l'adresse pointée (par exemple 01C23004)  
 cout << *ptr << endl;     // affiche "2"
 cout << *(ptr+5) << endl; // affiche "13"
 
 ptr=&premiers[3]; // pointe le 4ème élément (index 3)
 cout << hex << ptr << endl;  // affiche l'adresse pointée (par exemple 01C23018)
 cout << *ptr << endl;     // affiche "7"
 cout << *(ptr-1) << endl; // affiche "5"

Dans l'exemple 2, la différence d'adresse est de 20 octets (5 * sizeof(int)). Cela montre que l'adresse contenue dans le pointeur est toujours incrémentée ou décrémentée d'un multiple de la taille d'un élément (sizeof *ptr).