SlideShare une entreprise Scribd logo
1  sur  30
Télécharger pour lire hors ligne
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
Dr. Ammar Ladjailia Université de Souk Ahras
Plan
➔Introduction
➔Déclaration
➔Opérateur &
➔Opérateur *
➔Tableau & pointeur
2
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.
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;
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;
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
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;
}
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
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
Dr. Ammar Ladjailia Université de Souk Ahras
Pointeur à pointeur
What is the output?
58 58 58
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
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
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
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
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;
}
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;
}
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
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
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
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
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
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
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!
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
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
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
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
Dr. Ammar Ladjailia Université de Souk Ahras
Allocation dynamique
Exemple
T[i] = j++ + i ;

T[i] = j + i ;
J ++ ;
Dr. Ammar Ladjailia Université de Souk Ahras

Contenu connexe

Similaire à Les pointeurs en C/C++

Seance 4- Programmation en langage C
Seance 4- Programmation en langage CSeance 4- Programmation en langage C
Seance 4- Programmation en langage CFahad Golra
 
1-pl-sql 2021 2022.pdf
1-pl-sql 2021 2022.pdf1-pl-sql 2021 2022.pdf
1-pl-sql 2021 2022.pdfImaneZoubir1
 
Les fondamentaux du langage C
Les fondamentaux du langage CLes fondamentaux du langage C
Les fondamentaux du langage CAbdoulaye Dieng
 
02 Spécificité du C++ COURS SYS SYSSSSSS
02 Spécificité du C++  COURS SYS SYSSSSSS02 Spécificité du C++  COURS SYS SYSSSSSS
02 Spécificité du C++ COURS SYS SYSSSSSSAyoubElmrabet6
 
Lecture 3: Visualization and Programming
Lecture 3: Visualization and ProgrammingLecture 3: Visualization and Programming
Lecture 3: Visualization and ProgrammingSmee Kaem Chann
 
Cours algo: Les pointeurs
Cours algo: Les pointeursCours algo: Les pointeurs
Cours algo: Les pointeursSana REFAI
 

Similaire à Les pointeurs en C/C++ (8)

Seance 4- Programmation en langage C
Seance 4- Programmation en langage CSeance 4- Programmation en langage C
Seance 4- Programmation en langage C
 
cours Plsql _ abdelkhalek benhoumine
cours Plsql _ abdelkhalek benhouminecours Plsql _ abdelkhalek benhoumine
cours Plsql _ abdelkhalek benhoumine
 
1-pl-sql 2021 2022.pdf
1-pl-sql 2021 2022.pdf1-pl-sql 2021 2022.pdf
1-pl-sql 2021 2022.pdf
 
Les fondamentaux du langage C
Les fondamentaux du langage CLes fondamentaux du langage C
Les fondamentaux du langage C
 
02 Spécificité du C++ COURS SYS SYSSSSSS
02 Spécificité du C++  COURS SYS SYSSSSSS02 Spécificité du C++  COURS SYS SYSSSSSS
02 Spécificité du C++ COURS SYS SYSSSSSS
 
Language-C.ppt
Language-C.pptLanguage-C.ppt
Language-C.ppt
 
Lecture 3: Visualization and Programming
Lecture 3: Visualization and ProgrammingLecture 3: Visualization and Programming
Lecture 3: Visualization and Programming
 
Cours algo: Les pointeurs
Cours algo: Les pointeursCours algo: Les pointeurs
Cours algo: Les pointeurs
 

Plus de Ammar Ladjailia

complexite algorithmique
complexite algorithmiquecomplexite algorithmique
complexite algorithmiqueAmmar Ladjailia
 
Structures sequentielles en C/C++
Structures sequentielles en C/C++Structures sequentielles en C/C++
Structures sequentielles en C/C++Ammar Ladjailia
 
introduction au langage C/C++
introduction au langage C/C++introduction au langage C/C++
introduction au langage C/C++Ammar Ladjailia
 
Arbre binaire de recherche en C/C++
Arbre binaire de recherche en C/C++Arbre binaire de recherche en C/C++
Arbre binaire de recherche en C/C++Ammar Ladjailia
 

Plus de Ammar Ladjailia (6)

complexite algorithmique
complexite algorithmiquecomplexite algorithmique
complexite algorithmique
 
Structures sequentielles en C/C++
Structures sequentielles en C/C++Structures sequentielles en C/C++
Structures sequentielles en C/C++
 
introduction au langage C/C++
introduction au langage C/C++introduction au langage C/C++
introduction au langage C/C++
 
graphe en C/C++
graphe en C/C++graphe en C/C++
graphe en C/C++
 
Arbre binaire de recherche en C/C++
Arbre binaire de recherche en C/C++Arbre binaire de recherche en C/C++
Arbre binaire de recherche en C/C++
 
Les arbres en C/C++
Les arbres en C/C++Les arbres en C/C++
Les arbres en C/C++
 

Les pointeurs en C/C++

  • 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
  • 28. Dr. Ammar Ladjailia Université de Souk Ahras Allocation dynamique Exemple
  • 29. T[i] = j++ + i ;  T[i] = j + i ; J ++ ;
  • 30. Dr. Ammar Ladjailia Université de Souk Ahras