C'est quoi la différence entre passage par référence et passage
Résolu/Fermé
Le violoniste
Messages postés
7
Date d'inscription
samedi 13 avril 2013
Statut
Membre
Dernière intervention
25 avril 2013
-
17 avril 2013 à 22:48
AVENOEL.org - 12 janv. 2017 à 09:13
AVENOEL.org - 12 janv. 2017 à 09:13
A voir également:
- C++ passage par référence
- Reference pto - Accueil - Box & Connexion Internet
- Passage qwerty azerty - Guide
- Le compte reference est actuellement verrouillé - Forum DNS
- Passage windows 7 à 10 - Accueil - Mise à jour
- Comment changer le passage de la souris entre deux ecrans ✓ - Forum Windows
3 réponses
mamiemando
Messages postés
33372
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
22 novembre 2024
7 802
Modifié par mamiemando le 12/01/2017 à 10:19
Modifié par mamiemando le 12/01/2017 à 10:19
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
Le violoniste
Messages postés
7
Date d'inscription
samedi 13 avril 2013
Statut
Membre
Dernière intervention
25 avril 2013
22 avril 2013 à 21:11
22 avril 2013 à 21:11
merci beaucoup !! :D
mamiemando
Messages postés
33372
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
22 novembre 2024
7 802
23 avril 2013 à 10:30
23 avril 2013 à 10:30
De rien, bonne continuation !
Le violoniste
Messages postés
7
Date d'inscription
samedi 13 avril 2013
Statut
Membre
Dernière intervention
25 avril 2013
25 avril 2013 à 03:24
25 avril 2013 à 03:24
mercii
12 janv. 2017 à 09:13