C++ Pointeurs avec exemples
Que sont les pointeurs ?
In C++, un pointeur fait rรฉfรฉrence ร une variable qui contient l'adresse d'une autre variable. Comme les variables normales, les pointeurs ont un type de donnรฉes. Par exemple, un pointeur de type entier peut contenir l'adresse d'une variable de type entier. Un pointeur de type caractรจre peut contenir l'adresse d'une variable de type caractรจre.
Vous devriez voir un pointeur comme une reprรฉsentation symbolique dโune adresse mรฉmoire. Avec les pointeurs, les programmes peuvent simuler un appel par rรฉfรฉrence. Ils peuvent รฉgalement crรฉer et manipuler des structures de donnรฉes dynamiques. Dans C++, une variable pointeur fait rรฉfรฉrence ร une variable pointant vers une adresse spรฉcifique dans une mรฉmoire pointรฉe par une autre variable.
Adresses en C++
Comprendre C++ pointeurs, vous devez comprendre comment les ordinateurs stockent les donnรฉes.
Lorsque vous crรฉez une variable dans votre C++ programme, un espace dans la mรฉmoire de l'ordinateur lui est attribuรฉ. La valeur de cette variable est stockรฉe ร l'emplacement attribuรฉ.
Pour connaรฎtre l'emplacement dans la mรฉmoire de l'ordinateur oรน sont stockรฉes les donnรฉes, C++ Fournit le & (rรฉfรฉrence) opรฉrateur. L'opรฉrateur renvoie l'adresse occupรฉe par une variable.
Par exemple, si x est une variable, &x renvoie l'adresse de la variable.
Syntaxe de dรฉclaration de pointeur
La dรฉclaration de C++ prend la syntaxe suivante :
datatype *variable_name;
- Le type de donnรฉes est le type de base du pointeur qui doit รชtre un valide C++ type de donnรฉes.
- Le nom_variable doit รชtre le nom de la variable pointeur.
- L'astรฉrisque utilisรฉ ci-dessus pour la dรฉclaration du pointeur est similaire ร l'astรฉrisque utilisรฉ pour effectuer une opรฉration de multiplication. C'est l'astรฉrisque qui marque la variable comme pointeur.
Voici un exemple de dรฉclarations de pointeurs valides dans C++:
int *x; // a pointer to integer double *x; // a pointer to double float *x; // a pointer to float char *ch // a pointer to a character
Opรฉrateur de rรฉfรฉrence (&) et opรฉrateur de dรฉfรฉrence (*)
L'opรฉrateur de rรฉfรฉrence (&) renvoie l'adresse de la variable.
L'opรฉrateur de dรฉrรฉfรฉrencement (*) nous aide ร obtenir la valeur qui a รฉtรฉ stockรฉe dans une adresse mรฉmoire.
Par exemple :
Si nous avons une variable nommรฉe num, stockรฉe ร l'adresse 0x234 et stockant la valeur 28.
L'opรฉrateur de rรฉfรฉrence (&) renverra 0x234.
L'opรฉrateur de dรฉrรฉfรฉrencement (*) renverra 5.
Exemple 1:
#include <iostream>
using namespace std;
int main() {
int x = 27;
int *ip;
ip = &x;
cout << "Value of x is : ";
cout << x << endl;
cout << "Value of ip is : ";
cout << ip<< endl;
cout << "Value of *ip is : ";
cout << *ip << endl;
return 0;
}
Sortie :
Comment รงa marche:
Voici une capture d'รฉcran du code :
Code Explication:
- Importez le fichier d'en-tรชte iostream. Cela nous permettra d'utiliser les fonctions dรฉfinies dans le fichier d'en-tรชte sans obtenir d'erreurs.
- Incluez l'espace de noms std pour utiliser ses classes sans l'appeler.
- Appelez la fonction main(). La logique du programme doit รชtre ajoutรฉe dans le corps de cette fonction. Le { marque le dรฉbut du corps de la fonction.
- Dรฉclarez une variable entiรจre x et attribuez-lui la valeur 27.
- Dรฉclarez une variable de pointeur *ip.
- Stockez l'adresse de la variable x dans la variable pointeur.
- Imprimez du texte sur la console.
- Imprimez la valeur de la variable x ร l'รฉcran.
- Imprimez du texte sur la console.
- Imprime l'adresse de la variable x. La valeur de l'adresse รฉtait stockรฉe dans la variable ip.
- Imprimez du texte sur la console.
- Imprimer la valeur de stockรฉe ร l'adresse du pointeur.
- Le programme doit renvoyer une valeur en cas d'exรฉcution rรฉussie.
- Fin du corps de la fonction main().
Pointeurs et tableaux
Les tableaux et les pointeurs fonctionnent sur la base dโun concept connexe. Il y a diffรฉrentes choses ร noter lorsque vous travaillez avec des tableaux comportant des pointeurs. Le nom du tableau lui-mรชme indique l'adresse de base du tableau. Cela signifie que pour attribuer l'adresse d'un tableau ร un pointeur, vous ne devez pas utiliser d'esperluette (&).
Par exemple :
p = arr;
Ce qui prรฉcรจde est correct puisque arr reprรฉsente lโadresse des tableaux. Voici un autre exemple :
p = &arr;
Ce qui prรฉcรจde est incorrect.
Nous pouvons implicitement convertir un tableau en pointeur. Par exemple:
int arr [20]; int * ip;
Voici une opรฉration valide :
ip = arr;
Aprรจs la dรฉclaration ci-dessus, ip et arr seront รฉquivalents et partageront des propriรฉtรฉs. Cependant, une adresse diffรฉrente peut รชtre attribuรฉe ร ip, mais nous ne pouvons rien attribuer ร arr.
Exemple 2:
Cet exemple montre comment parcourir un tableau ร l'aide de pointeurs :
#include <iostream>
using namespace std;
int main() {
int *ip;
int arr[] = { 10, 34, 13, 76, 5, 46 };
ip = arr;
for (int x = 0; x < 6; x++) {
cout << *ip << endl;
ip++;
}
return 0;
}
Sortie :
Voici une capture d'รฉcran du code :
Code Explication:
- Dรฉclarez une variable de pointeur entier ip.
- Dรฉclarez un tableau nommรฉ arr et stockez-y 6 entiers.
- Attribuez arr ร ip. L'ip et l'arr deviendront รฉquivalents.
- Crรฉez une boucle for. La variable de boucle x a รฉtรฉ crรฉรฉe pour parcourir les รฉlรฉments du tableau de l'index 0 ร 5.
- Imprime les valeurs stockรฉes ร l'adresse IP du pointeur. Une valeur sera renvoyรฉe par itรฉration et un total de 6 rรฉpรฉtitions seront effectuรฉes. La fin est un C++ mot-clรฉ qui signifie la ligne de fin. Cette action vous permet de dรฉplacer le curseur vers la ligne suivante aprรจs l'impression de chaque valeur. Chaque valeur sera imprimรฉe sur une ligne individuelle.
- Pour dรฉplacer le pointeur vers la position int suivante aprรจs chaque itรฉration.
- Fin de la boucle for a.
- Le programme doit renvoyer quelque chose en cas d'exรฉcution rรฉussie.
- Fin du corps de la fonction main().
Pointeur nul
S'il n'y a pas d'adresse exacte ร attribuer, la variable de pointeur peut se voir attribuer une valeur NULL. Cela devrait รชtre fait lors de la dรฉclaration. Un tel pointeur est appelรฉ pointeur nul. Sa valeur est nulle et est dรฉfinie dans de nombreuses bibliothรจques standards comme iostream.
Exemple 3:
#include <iostream>
using namespace std;
int main() {
int *ip = NULL;
cout << "Value of ip is: " << ip;
return 0;
}
Sortie :
Voici une capture d'รฉcran du code :
Code Explication:
- Dรฉclarez une variable de pointeur ip et attribuez-lui la valeur NULL.
- Imprimez la valeur de la variable de pointeur ip ร cรดtรฉ du texte sur la console.
- Le programme doit renvoyer de la valeur une fois terminรฉ.
- Fin du corps de la fonction main().
Pointeurs de variables
Avec C++, vous pouvez manipuler les donnรฉes directement depuis la mรฉmoire de l'ordinateur.
L'espace mรฉmoire peut รชtre attribuรฉ ou rรฉaffectรฉ ร volontรฉ. Ceci est rendu possible par les variables Pointeur.
Les variables de pointeur pointent vers une adresse spรฉcifique dans la mรฉmoire de l'ordinateur pointรฉe par une autre variable.
Il peut รชtre dรฉclarรฉ ainsi :
int *p;
Ou,
int* p;
Dans votre exemple, nous avons dรฉclarรฉ la variable pointeur p.
Il contiendra une adresse mรฉmoire.
L'astรฉrisque est l'opรฉrateur de dรฉrรฉfรฉrencement qui signifie un pointeur vers.
Le pointeur p pointe vers une valeur entiรจre dans lโadresse mรฉmoire.
Exemple 4:
#include <iostream>
using namespace std;
int main() {
int *p, x = 30;
p = &x;
cout << "Value of x is: " << *p;
return 0;
}
Sortie :
Voici une capture d'รฉcran du code :
Code Explication:
- Dรฉclarez une variable de pointeur p et une variable x avec une valeur de 30.
- Attribuez lโadresse de la variable x ร p.
- Imprimez la valeur de la variable de pointeur p ร cรดtรฉ du texte sur la console.
- Le programme doit renvoyer de la valeur une fois terminรฉ.
- Fin du corps de la fonction main().
Application des pointeurs
Fonctions dans C++ ne peut renvoyer quโune seule valeur. De plus, toutes les variables dรฉclarรฉes dans une fonction sont allouรฉes sur la pile d'appels de fonction. Dรจs le retour de la fonction, toutes les variables de la pile sont dรฉtruites.
Les arguments de la fonction sont transmis par valeur, et toute modification effectuรฉe sur les variables ne change pas la valeur des variables rรฉelles transmises. L'exemple suivant permet d'illustrer ce concept : -
Exemple 5:
#include <iostream>
using namespace std;
void test(int*, int*);
int main() {
int a = 5, b = 5;
cout << "Before changing:" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
test(&a, &b);
cout << "\nAfter changing" << endl;
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
void test(int* n1, int* n2) {
*n1 = 10;
*n2 = 11;
}
Sortie :
Voici une capture d'รฉcran du code :
Code Explication:
- Crรฉez un prototype d'une fonction nommรฉe test qui prendra deux paramรจtres entiers.
- Appelez la fonction main(). Nous ajouterons la logique du programme ร l'intรฉrieur de son corps.
- Dรฉclarez deux variables entiรจres a et b, chacune avec une valeur de 5.
- Imprimez du texte sur la console. Le endl (fin de ligne) dรฉplacera le curseur pour commencer l'impression dans la ligne suivante.
- Imprimez la valeur de la variable a sur la console avec un autre texte. Le endl (fin de ligne) dรฉplacera le curseur pour commencer l'impression dans la ligne suivante.
- Imprimez la valeur de la variable b sur la console avec un autre texte. Le endl (fin de ligne) dรฉplacera le curseur pour commencer l'impression dans la ligne suivante.
- Crรฉez une fonction nommรฉe test() qui prend les adresses des variables a et b comme paramรจtres.
- Imprimez du texte sur la console. Le \n crรฉera une nouvelle ligne vide avant que le texte ne soit imprimรฉ. Le endl (ligne de fin) dรฉplacera le curseur pour commencer l'impression sur la ligne suivante aprรจs l'impression du texte.
- Imprimez la valeur de la variable a sur la console avec un autre texte. Le endl (fin de ligne) dรฉplacera le curseur pour commencer l'impression dans la ligne suivante.
- Imprimez la valeur de la variable b sur la console avec un autre texte. Le endl (fin de ligne) dรฉplacera le curseur pour commencer l'impression dans la ligne suivante.
- Le programme doit renvoyer de la valeur une fois terminรฉ.
- Fin du corps de la fonction main().
- Dรฉfinition de la fonction test(). La fonction doit prendre deux variables de pointeur entiers *n1 et *n2.
- Attribuer ร la variable pointeur *n1 une valeur de 10.
- Attribuer ร la variable pointeur *n2 une valeur de 11.
- Fin du corps de la fonction test().
Mรชme si de nouvelles valeurs sont attribuรฉes aux variables a et b dans le test de fonction, une fois l'appel de fonction terminรฉ, la mรชme chose n'est pas reflรฉtรฉe dans la fonction externe principale.
L'utilisation de pointeurs comme arguments de fonction permet de transmettre l'adresse rรฉelle de la variable dans la fonction, et toutes les modifications effectuรฉes sur la variable seront reflรฉtรฉes dans la fonction externe.
Dans le cas ci-dessus, la fonction ยซ test ยป a l'adresse des variables ยซ a ยป et ยซ b ยป. Ces deux variables sont directement accessibles depuis la fonction ยซ test ยป, et donc toute modification apportรฉe ร ces variables est reflรฉtรฉe dans la fonction appelante ยซ main ยป.
Avantages de l'utilisation des pointeurs
Voici les avantages/avantages de lโutilisation des pointeurs
- Les pointeurs sont des variables qui stockent l'adresse d'autres variables dans C++.
- Plusieurs variables peuvent รชtre modifiรฉes et renvoyรฉes par la fonction ร l'aide de pointeurs.
- La mรฉmoire peut รชtre allouรฉe et dรฉsallouรฉe dynamiquement ร l'aide de pointeurs.
- Les pointeurs aident ร simplifier la complexitรฉ du programme.
- La vitesse d'exรฉcution d'un programme s'amรฉliore grรขce ร l'utilisation de pointeurs.
Rรฉsumรฉ
- Un pointeur fait rรฉfรฉrence ร une variable contenant lโadresse dโune autre variable.
- Chaque pointeur a un type de donnรฉes valide.
- Un pointeur est une reprรฉsentation symbolique d'une adresse mรฉmoire.
- Les pointeurs permettent aux programmes de simuler un appel par rรฉfรฉrence et de crรฉer et manipuler des structures de donnรฉes dynamiques.
- Arrays et les pointeurs utilisent un concept connexe.
- Le nom du tableau indique la base du tableau.
- Si vous souhaitez attribuer l'adresse d'un tableau ร un pointeur, n'utilisez pas d'esperluette (&).
- S'il n'y a pas d'adresse spรฉcifique pour attribuer une variable de pointeur, attribuez-lui une valeur NULL.







