Vous pouvez voir le code exemple suivant:
#include <iostream>
using namespace std;
void change(int*& ptr) {
cout << endl;
cout << "==================change(int*& ptr)====================" << endl;
cout << " &ptr = " << &ptr << endl;
cout << " ptr = " << ptr << endl;
cout << "=======================================================" << endl;
cout << endl;
*ptr *= *ptr;
}
int main(void) {
int* ptrNumber = new int(10);
cout << endl;
cout << "&ptrNumber = " << &ptrNumber << endl;
cout << "ptrNumber = " << ptrNumber << endl;
cout << ">>> *ptrNumber = " << *ptrNumber << endl;
change(ptrNumber);
cout << "<<< *ptrNumber = " << *ptrNumber << endl;
}
J'ai installé et utilisé Cygwin g ++ pour compiler le code source ci-dessus, le fichier binaire est out_pointer.exe. Exécution de out_pointer.exe, la sortie est comme suit:
$ ./out_pointer.exe
&ptrNumber = 0x28ac3c
ptrNumber = 0x800102c0
>>> *ptrNumber = 10
==================change(int*& ptr)====================
&ptr = 0x28ac3c
ptr = 0x800102c0
=======================================================
<<< *ptrNumber = 100
De la sortie ci-dessus, nous voyons
&ptrNumber = &ptr
Ainsi, ptr est alias de ptrNumber. Vous pouvez modifier ptrNumber dans la fonction void change (int * & ptr) en modifiant ptr. Par exemple, vous pouvez pointer ptr vers un autre emplacement de mémoire comme ci-dessous:
#include <iostream>
using namespace std;
void change(int*& ptr) {
cout << endl;
cout << "==================change(int*& ptr)====================" << endl;
cout << " &ptr = " << &ptr << endl;
cout << " >>> ptr = " << ptr << endl;
ptr = new int(20);
cout << " <<< ptr = " << ptr << endl;
cout << "=======================================================" << endl;
cout << endl;
}
int main(void) {
int* ptrNumber = new int(10);
cout << endl;
cout << ">>> &ptrNumber = " << &ptrNumber << endl;
cout << ">>> ptrNumber = " << ptrNumber << endl;
cout << ">>> *ptrNumber = " << *ptrNumber << endl;
change(ptrNumber);
cout << "<<< &ptrNumber = " << &ptrNumber << endl;
cout << "<<< ptrNumber = " << ptrNumber << endl;
cout << "<<< *ptrNumber = " << *ptrNumber << endl;
}
sortie Nouveau:
$ ./out_pointer.exe
>>> &ptrNumber = 0x28ac3c
>>> ptrNumber = 0x800102c0
>>> *ptrNumber = 10
==================change(int*& ptr)====================
&ptr = 0x28ac3c
>>> ptr = 0x800102c0
<<< ptr = 0x80048328
=======================================================
<<< &ptrNumber = 0x28ac3c
<<< ptrNumber = 0x80048328
<<< *ptrNumber = 20
Si vous ne voulez pas créer un pointeur, pourquoi avez-vous besoin de la fonction de prendre un pointeur (par référence)? Pourquoi pas 'set (int & v) {v = 10;}'? – Beta
Parce que ma classe stocke la valeur, mais cette valeur est ensuite passée comme pointeur vers une autre classe qui stocke ce pointeur. Ce pointeur doit être défini par référence à l'argument pointeur dans la fonction qui le fait, car sinon le pointeur passé ne pointe pas vraiment vers la valeur, mais vers sa copie. Et avant de paramétrer ce pointeur je ne veux pas créer de pointeur temporaire juste pour pouvoir le passer .. C'est pourquoi je n'ai pas introduit de problème réel, mais seulement celui qui me ressemble et qui est beaucoup plus facile. – Raven