Références et pointeurs
Objectifs:
- Comprendre la différence entre les références et les pointeurs
- Utiliser le passage par référence et par adresse
Exercice 1:
Ecrire un programme C++ qui :
- déclare un entier a;
- déclare une référence vers cet entier ref_a;
- déclare un pointeur vers cet entier p_a;
- affiche les variables, leurs adresses, la valeur pointée.
Donner un entier : 5
Le contenu des variables:
- variable i : 5
- variable ref_i : 5
- variable p_i : 0x24fe98
Leur adresse:
- adresse de i : 0x24fe98
- adresse de ref_i : 0x24fe98
- adresse de p_i : 0x24fe94
La valeur pointee : 5
Exercice 2
Écrire une fonction nommée incrementer() permettant d’incrémenter la valeur d’une variable passée en paramètre et une fonction nommée permuter() permettant d’échanger les contenus de 2 variables de type int fournies en argument :
- en transmettant l’adresse des variables concernées (seule méthode utilisable en C) ;
- en utilisant la transmission par référence.
Dans les deux cas, écrire un programme (main) qui teste les deux fonctions.
Donner la valeur de A : 6
Donner la valeur de B : 29
- Appel par Adresse
la valeur de A apres incrementation : 7
la valeur de A apres permutation : 29
la valeur de B apres permutation : 7
- Appel par Reference
la valeur de A est: 29
la valeur de B est: 7
la valeur de A apres incrementation : 30
la valeur de A apres permutation : 7
la valeur de B apres permutation : 30
Exercice 1:
//Programme : Références et pointeurs //Auteur : IDMANSOUR //Copyright : Exelib.net #include<iostream> using namespace std; int main() { int i; int *p_i; //pointeur cout<<"Donner un entier : "; cin>>i; int &ref_i=i; //Reference p_i=&i; cout<<"Le contenu des variables:"<<endl; cout<<"- variable i : "<<i<<endl; cout<<"- variable ref_i : "<<ref_i<<endl; cout<<"- variable p_i : "<<p_i<<endl; cout<<"Leur adresse: "<<endl; cout<<"- adresse de i : "<<&i<<endl; cout<<"- adresse de ref_i : "<<&ref_i<<endl; cout<<"- adresse de p_i : "<<&p_i<<endl; cout<<"La valeur pointee : "<<*p_i<<endl; return 0; }
Exercice 2:
//Programme : Incrémentation et permutation //Auteur : IDMANSOUR //Copyright : Exelib.net #include<iostream> using namespace std; //Passage par adresse void permuter(int * x,int * y) { int p; p = *x; *x = *y; *y = p; } void incrementer(int * x) { (*x)++; } //Passage par référence void incrementer(int & x) { x++; } void permuter(int & x,int & y) { int p; p = x; x = y; y = p; } int main() { int a, b; cout<<"Donner la valeur de A : "; cin>>a; cout<<"Donner la valeur de B : "; cin>>b; //Appel par adresse cout<<"- Appel par Adresse"<<endl; incrementer(&a); cout<<"la valeur de A apres incrementation : "<<a<<endl; permuter(&a,&b); cout<<"la valeur de A apres permutation : "<<a<<endl; cout<<"la valeur de B apres permutation : "<<b<<endl<<endl; //Appel par reference cout<<"- Appel par Reference"<<endl; cout<<"la valeur de A est: "<<a<<endl; cout<<"la valeur de B est: "<<b<<endl; incrementer(a); cout<<"la valeur de A apres incrementation : "<<a<<endl; permuter(a,b); cout<<"la valeur de A apres permutation : "<<a<<endl; cout<<"la valeur de B apres permutation : "<<b<<endl; return 0; }
Dans la fonction d'incrémentation avec passage par adresse (*x)++, les parenthèses sont obligatoires pour incrémenter la valeur pointée et non pas son adresse (le pointeur)