C'est quoi la différence entre passage par référence et passage
Résolu
Le violoniste
Messages postés
7
Date d'inscription
Statut
Membre
Dernière intervention
-
AVENOEL.org -
AVENOEL.org -
Bonsoir à Tous , c'est quoi la différence entre passage par référence et passage par pointeur?
Merci
C++
Merci
C++
A voir également:
- C++ passage par référence
- Passage qwerty azerty - Guide
- Reference pto - Accueil - Box & Connexion Internet
- Test passage windows 11 - Guide
- Passage à windows 11 gratuit - Guide
- Passage windows 7 à 10 - Accueil - Mise à jour
3 réponses
Ici les trois types de passages :
Comme tu le vois, un passage par valeur manipule une recopie (c'est à dire que le x dans incrementer_par_valeur et dans main désigne deux zones mémoires différentes. En effet en C et en C++, quand tu appelles une fonction, les paramètres qu'on lui passe sont une recopie des variables manipulées par la fonction "appelante" (ici main).
En C, notre fonction "incrementer" aurait donc besoin d'un passage par pointeur (ou alors de retourner l'entier incrementé). C'est la deuxième fonction. Le problème des pointeurs c'est que c'est parfois lourd à manipuler et concrètement, si px == NULL, ici ça fera une erreur de segmentation puisque je n'ai pas fait de vérification. Il faudrait par exemple écrire :
Bref il faut être prudent, et souvent c'est syntaxiquement un peu lourd. Note que c'est tout à fait correct en C++.
En C++, on aura donc plutôt tendance à faire un passage par référence (qui contrairement à un pointeur, doit être initalisée). C'est la troisième fonction et comme tu le vois c'est plus léger. Syntaxiquement, tout se passe comme dans un passage par valeur dans le corps de la fonction, mais fonctionnellement parlant, ça se comporte plus comme un passage par pointeur dans la mesure où ici c'est bien le "x" du "main" qui est modifié.
Ceci dit, en C++ on peut être amené à faire des passages par pointeurs (par exemple si ce paramètre n'est pas forcément utilisé par la fonction, on peut ainsi passer NULL, et contrôler la valeur de ce pointeur dans la fonction).
Bonne chance
#include <iostream> void incrementer_par_valeur(int x) { x++; // si on affichait x ici, on verrait 8 } void incrementer_par_pointeur(int * px) { (*px)++; } void incrementer_par_reference(int & x) { x++; } int main() { int x = 7; std::cout << "x = " << x << std::endl; // 7 incrementer_par_valeur(x); std::cout << "x = " << x << std::endl; // 7 ! (et non 8) incrementer_par_pointeur(&x); std::cout << "x = " << x << std::endl; // 8 incrementer_par_reference(x) std::cout << "x = " << x << std::endl; // 9 return 0; }
Comme tu le vois, un passage par valeur manipule une recopie (c'est à dire que le x dans incrementer_par_valeur et dans main désigne deux zones mémoires différentes. En effet en C et en C++, quand tu appelles une fonction, les paramètres qu'on lui passe sont une recopie des variables manipulées par la fonction "appelante" (ici main).
En C, notre fonction "incrementer" aurait donc besoin d'un passage par pointeur (ou alors de retourner l'entier incrementé). C'est la deuxième fonction. Le problème des pointeurs c'est que c'est parfois lourd à manipuler et concrètement, si px == NULL, ici ça fera une erreur de segmentation puisque je n'ai pas fait de vérification. Il faudrait par exemple écrire :
void incrementer_par_pointeur(int * px) { if (px) (*px)++; }
Bref il faut être prudent, et souvent c'est syntaxiquement un peu lourd. Note que c'est tout à fait correct en C++.
En C++, on aura donc plutôt tendance à faire un passage par référence (qui contrairement à un pointeur, doit être initalisée). C'est la troisième fonction et comme tu le vois c'est plus léger. Syntaxiquement, tout se passe comme dans un passage par valeur dans le corps de la fonction, mais fonctionnellement parlant, ça se comporte plus comme un passage par pointeur dans la mesure où ici c'est bien le "x" du "main" qui est modifié.
Ceci dit, en C++ on peut être amené à faire des passages par pointeurs (par exemple si ce paramètre n'est pas forcément utilisé par la fonction, on peut ainsi passer NULL, et contrôler la valeur de ce pointeur dans la fonction).
Bonne chance
AVENOEL.org
Merci