1. Dr. Ammar LADJAILIA Université de Souk Ahras
Pointeurs
UNIVERSITÉ DE SOUK AHRAS
FACULTÉ DES SCIENCES ET DE LA TECHNOLOGIE
DÉPARTEMENT DE MATHÉMATIQUES ET INFORMATIQUE
2. Dr. Ammar Ladjailia Université de Souk Ahras
Plan
➔Introduction
➔Déclaration
➔Opérateur &
➔Opérateur *
➔Tableau & pointeur
2
3. Dr. Ammar Ladjailia Université de Souk Ahras
Mémoire contrale
La valeur de la variable a est : 100,
stocker dans l’adresse : 1024
100
… … 1024 …
Adresses mémoire : 1024 1032
int a = 100;
…
1020
a
Au moment d’exécution d’un programme, chaque variable
est réservé un espace mémoire dépond de son type.
4. Dr. Ammar Ladjailia Université de Souk Ahras
Pointeurs
100
… … 1024 …
Adresses mémoire : 1024 1032
int a = 100;
…
1020
a
Un pointeur désigne un type particulier de variable dont la
valeur est une adresse.
int *p = &a;
p
int a = 100; *p = 100;
5. Dr. Ammar Ladjailia Université de Souk Ahras
Pointeurs
Déclaration
Où type est le type de données pointé(ex. int, char, double)
Exemples:
int *n;
double *r;
type* pointer_name;
//or
type *pointer_name;
6. Dr. Ammar Ladjailia Université de Souk Ahras
Opérateur &
• Operateur (&) donne l'adresse mémoire de la variable
• Usage: &variable_name
100
… … … …
Memory address: 1024
…
1020
a
int a = 100;
//get the value,
cout << a; //prints 100
//get the memory address
cout << &a; //prints 1024
7. Dr. Ammar Ladjailia Université de Souk Ahras
Opérateur &
100
88 … … …
Memory address: 1024 1032
a
…
1020
b
Result is:
The address of a is: 1020
The address of b is: 1024
#include <iostream>
using namespace std;
void main(){
int a, b;
a = 88;
b = 100;
cout << "The address of a is: " << &a << endl;
cout << "The address of b is: " << &b << endl;
}
8. Dr. Ammar Ladjailia Université de Souk Ahras
➢ La valeur de pointeur p est l’adresse de la variable a
➢ Un pointeur est également une variable, il a donc sa
propre adresse mémoire
100
88 … 1024 …
Memory address: 1024 1032
…
1020
a p
int a = 100;
int *p = &a;
cout << a << " " << &a <<endl;
cout << p << " " << &p <<endl;
Result is:
100 1024
1024 1032
Opérateur &
Pointeur à pointeur
9. Dr. Ammar Ladjailia Université de Souk Ahras
➢ La valeur de pointeur p est l’adresse de la variable a
➢ Un pointeur est également une variable, il a donc sa
propre adresse mémoire
100
88 … 1024 …
Memory address: 1024 1032
…
1020
a p
int a = 100;
int *p = &a;
cout << a << " " << &a <<endl;
cout << p << " " << &p <<endl;
Result is:
100 1024
1024 1032
Opérateur &
Pointeur à pointeur
10. Dr. Ammar Ladjailia Université de Souk Ahras
Pointeur à pointeur
What is the output?
58 58 58
11. Dr. Ammar Ladjailia Université de Souk Ahras
Opérateur *
On peut accéder à la valeur stockée dans la variable
pointée en utilisant l'opérateur de déréférencement (*)
100
88 … 1024 …
Memory address: 1024 1032
…
1020
int a = 100;
int *p = &a;
cout << a << endl;
cout << &a << endl;
cout << p << " " << *p << endl;
cout << &p << endl;
Result is:
100
1024
1024 100
1032
a p
12. Dr. Ammar Ladjailia Université de Souk Ahras
Confusion
➢ Déclaration d’un pointeur: int *p;
➢ Ne pas confondre un pointeur avec l’opérateur de
déréférencement, qui est également écrit avec un astérisque (*).
int a = 100, b = 88, c = 8;
int *p1 = &a, *p2, *p3 = &c;
p2 = &b; // p2 points to b
p2 = p1; // p2 points to a
b = *p3; //assign c to b
*p2 = *p3; //assign c to a
cout << a << b << c;
Result is:
8 8 8
13. Dr. Ammar Ladjailia Université de Souk Ahras
The code
void doubleIt(int x,
int * p)
{
*p = 2 * x;
}
int main(int argc, const
char * argv[])
{
int a = 16;
doubleIt(9, &a);
return 0;
}
Box diagram
Memory Layout
9
x
p
(8200)
x
(8196)
16
a
main
doubleIt
p
a
(8192)
16
9
8192
main
doubleIt
a gets 18
Exemple
14. Dr. Ammar Ladjailia Université de Souk Ahras
Une référence est un nom supplémentaire pour
un emplacement mémoire existant
9
x
ref
Pointer:
9
x
ref
Reference:
int x=9;
int *ref;
ref = &x;
int x = 9;
int &ref = x;
Référence
15. Dr. Ammar Ladjailia Université de Souk Ahras
Passage par pointeur
void IndirectSwap(char *Ptr1, char *Ptr2){
char temp = *Ptr1;
*Ptr1 = *Ptr2;
*Ptr2 = temp;
}
int main() {
char a = 'y';
char b = 'n';
IndirectSwap(&a, &b);
cout << a << b << endl;
return 0;
}
16. Dr. Ammar Ladjailia Université de Souk Ahras
Passage par référence
void IndirectSwap(char& y, char& z) {
char temp = y;
y = z;
z = temp;
}
int main() {
char a = 'y';
char b = 'n';
IndirectSwap(a, b);
cout << a << b << endl;
return 0;
}
17. Dr. Ammar Ladjailia Université de Souk Ahras
Pointeur & Tableau
Le nom d'un tableau pointe uniquement vers le
premier élément et non vers le tableau entier.
1000
1012
1016
1004
1008
18. Dr. Ammar Ladjailia Université de Souk Ahras
Pointeur & Tableau
#include <iostream>
using namespace std;
void main (){
int a[5];
cout << "Address of a[0]: " << &a[0] << endl
<< "Name as pointer: " << a << endl;
}
Result:
Address of a[0]: 0x0065FDE4
Name as pointer: 0x0065FDE4
19. Dr. Ammar Ladjailia Université de Souk Ahras
Pointeur & Tableau
#include <iostream>
using namespace std;
void main(){
int a[5] = {2,4,6,8,22};
cout << *a << " "
<< a[0];
} //main
2
4
8
6
22
a[4]
a[0]
a[2]
a[1]
a[3]
a
a
This element is
called a[0] or
*a
20. Dr. Ammar Ladjailia Université de Souk Ahras
Pointeur & Tableau
Pour accéder à un tableau, n'importe quel pointeur
vers le premier élément peut être utilisé à la place
du nom du tableau.
We could replace *p by *a
22
#include <iostream>
using namespace std;
void main(){
int a[5] = {2,4,6,8,22};
int *p = a;
cout << a[0] << " "
<< *p;
}
2
4
8
6
22
a[4]
a[0]
a[2]
a[1]
a[3]
a p
a
21. Dr. Ammar Ladjailia Université de Souk Ahras
Arithmétique du pointeur
Étant donné un pointeur p, p + n fait référence à
l'élément qui est décalé de p de n positions.
2
4
8
6
22
a
a + 2
a + 4
a + 3
a + 1 p
p + 2
p + 3
p - 1
p + 1
22. Dr. Ammar Ladjailia Université de Souk Ahras
Pointeur & Tableau
*(a+n) is identical to a[n]
2
4
8
6
22
a
a + 2
a + 4
a + 3
a + 1
a[3] or *(a + 3)
a[2] or *(a + 2)
a[1] or *(a + 1)
a[0] or *(a + 0)
a[4] or *(a + 4)
Note: flexible pointer syntax
23. Dr. Ammar Ladjailia Université de Souk Ahras
Pointeur & Tableau
NULL est une valeur spéciale qui indique un pointeur vide
int *p;
p = 0;
cout << p << endl; //prints 0
cout << &p << endl;//prints address of p
cout << *p << endl;//Error!
24. Dr. Ammar Ladjailia Université de Souk Ahras
Gestion de la mémoire
Allocation statique
La mémoire est allouée au moment de la
compilation
Allocation dynamique
La mémoire est allouée au moment de l'exécution
25. Dr. Ammar Ladjailia Université de Souk Ahras
Syntaxe
ptr = new SomeType;
Où ptr est un pointeur de type SomeType
p
Variable int non initialisée
Exemple
int* p = new int;
Opérateur new
26. Dr. Ammar Ladjailia Université de Souk Ahras
Destruction: delete
Syntaxe
delete p;
L’espace pointé par p est retourné à l’espace libre et p est maintenant
indéfini
p
Exemple
int* p = new int;
*p = 10;
delete p;
10
27. Dr. Ammar Ladjailia Université de Souk Ahras
Tableau dynamique
Syntaxe
P = new SomeType[Expression];
Où
P est un pointeur de type SomeType
Expression est le nombre des objets à créer – Création d’un
tableau
En raison de la syntaxe flexible du pointeur, P
peut être considéré comme un tableau