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

3 réponses

mamiemando Messages postés 33774 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
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
12
AVENOEL.org
 
Merci
0
Le violoniste Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
 
merci beaucoup !! :D
0
mamiemando Messages postés 33774 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
De rien, bonne continuation !
0
Le violoniste Messages postés 7 Date d'inscription   Statut Membre Dernière intervention  
 
mercii
0