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
Bonsoir à Tous , c'est quoi la différence entre passage par référence et passage par pointeur?
Merci
C++

3 réponses

mamiemando Messages postés 33207 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 24 juillet 2024 7 765
Modifié par mamiemando le 12/01/2017 à 10:19
Ici les trois types de passages :

#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
Merci
0
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
merci beaucoup !! :D
mamiemando Messages postés 33207 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 24 juillet 2024 7 765
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
mercii
0