Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1543 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C --> C++] passage par référence

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C --> C++] passage par référence

n°1579135
in_your_ph​ion
Posté le 26-06-2007 à 09:42:30  profilanswer
 

bonjour,
 
j'aimerais savoir quelle est la différence entre & et un passage par adresse dans une fonction ou ailleurs. En C le & permet de designer l'adresse d'une variable, en c++ j'ai l'impression que c'est un alias, mais je ne comprend pas bien la difference avec un pointeur ou un passage par adresse.  
 
Par exemple :  
 

Code :
  1. void ma_fonction ( int & toto );


 
 
quelle la différence avec :
 

Code :
  1. void ma_fonction ( int * toto );


 
merci  :jap:

mood
Publicité
Posté le 26-06-2007 à 09:42:30  profilanswer
 

n°1579212
boulgakov
Posté le 26-06-2007 à 11:24:44  profilanswer
 

in_your_phion a écrit :

Code :
  1. void ma_fonction ( int & toto );


 
 
quelle la différence avec :
 

Code :
  1. void ma_fonction ( int * toto );




 
Si ta fonction sert à incrémenter toto, par exemple :
 

Code :
  1. void ma_fonction ( int & toto )
  2. {
  3.   ++toto;
  4. }


 

Code :
  1. void ma_fonction ( int * toto )
  2. {
  3.   ++(*toto);
  4. }


 
Le passage par référence est en quelque sorte un "raccourci" du langage, pour ne pas avoir à déréférencer le pointeur. Le rapport avec l'opérateur '&' qui renvoie l'adresse d'un objet  
 

Code :
  1. int a = 1;
  2. int *p = &a;


 
est assez lointain, finalement. Perso je trouve qu'un autre choix que '&' pour la syntaxe du passage par référence aurait été souhaitable, mais bref.
 

n°1579215
Taz
bisounours-codeur
Posté le 26-06-2007 à 11:25:49  profilanswer
 

ouvre un livre.

n°1579237
boulgakov
Posté le 26-06-2007 à 11:48:04  profilanswer
 

Taz a écrit :

ouvre un livre.


 
Oui, aussi.

n°1579250
IrmatDen
Posté le 26-06-2007 à 12:07:11  profilanswer
 

Il y a aussi que tu es certain que l'objet passé est obligatoirement valide (ni pointeur null, ni pointeur pointant n'importe où dans la mémoire). Tu ne peux pas non plus faire un new/delete sur cette variable, quand bien même sa vraie origine est dans la mémoire (ou disons, je ne crois pas que ce soit possible...)

n°1579508
Taz
bisounours-codeur
Posté le 26-06-2007 à 17:22:19  profilanswer
 

il n'y a AUCUN rapport entre les références et les allocations dynamiques.

n°1579514
IrmatDen
Posté le 26-06-2007 à 17:28:21  profilanswer
 

Je sais, pardon, j'ai fourché sur la dernière partie de la phrase... qui ne veut pas dire grand chose du coup :/ (Je voulais dire "quand bien même sa 'vraie' origine serait dans la heap" => pour préciser qu'on peut passer une référence vers un objet résidant en heap, et interdire par la même tout manipulation de l'adresse)

n°1579535
Taz
bisounours-codeur
Posté le 26-06-2007 à 17:52:06  profilanswer
 

IrmatDen a écrit :

Je sais, pardon, j'ai fourché sur la dernière partie de la phrase... qui ne veut pas dire grand chose du coup :/ (Je voulais dire "quand bien même sa 'vraie' origine serait dans la heap" => pour préciser qu'on peut passer une référence vers un objet résidant en heap, et interdire par la même tout manipulation de l'adresse)


je ne vois toujours pas le rapport.

Code :
  1. void kill(int &i) { delete &i; }

n°1579539
IrmatDen
Posté le 26-06-2007 à 18:05:52  profilanswer
 

Au temps pour moi, j'ai mélangé avec avec le "reseating" ("remplacement"? Ce serait une bonne traduction?)

n°1579581
in_your_ph​ion
Posté le 26-06-2007 à 20:38:51  profilanswer
 

boulgakov a écrit :

Si ta fonction sert à incrémenter toto, par exemple :
 

Code :
  1. void ma_fonction ( int & toto )
  2. {
  3.   ++toto;
  4. }


 

Code :
  1. void ma_fonction ( int * toto )
  2. {
  3.   ++(*toto);
  4. }


 
Le passage par référence est en quelque sorte un "raccourci" du langage, pour ne pas avoir à déréférencer le pointeur. Le rapport avec l'opérateur '&' qui renvoie l'adresse d'un objet  
 

Code :
  1. int a = 1;
  2. int *p = &a;


 
est assez lointain, finalement. Perso je trouve qu'un autre choix que '&' pour la syntaxe du passage par référence aurait été souhaitable, mais bref.


 
salut,
 
ok merci  :) . Donc ca a un peut avoir avec le & en C ...ou pas du tout ? En c++, si on peut incrémenter/décrémenter avec & les adresses, peut on le faire sur une valeur ?
 
merci par avance
 

mood
Publicité
Posté le 26-06-2007 à 20:38:51  profilanswer
 

n°1579670
boulgakov
Posté le 26-06-2007 à 23:24:52  profilanswer
 

in_your_phion a écrit :

salut,
 
ok merci  :) . Donc ca a un peut avoir avec le & en C ...ou pas du tout ? En c++, si on peut incrémenter/décrémenter avec & les adresses, peut on le faire sur une valeur ?
 
merci par avance


 
Euh, je ne veux pas être soupe-au-lait, mais ce sont des questions "basiques". Enfin là, j'ai pas vraiment compris la question à vrai dire, mais le sujet de manière générale est traité dans les bases de n'importe quel bouquin bien foutu. Ou sur le Net, par exemple ici :
 
http://www.commentcamarche.net/cpp/cpppoint.php3
 
Je n'ai pas fouillé, tu peux sûrement trouver mieux.
 
"ca a un peut avoir avec le & en C" --> oui pour "int a = 1; int *p = &a" c'est comme en C, non pour le passage par référence

n°1579674
in_your_ph​ion
Posté le 26-06-2007 à 23:30:08  profilanswer
 

boulgakov a écrit :

Euh, je ne veux pas être soupe-au-lait, mais ce sont des questions "basiques". Enfin là, j'ai pas vraiment compris la question à vrai dire, mais le sujet de manière générale est traité dans les bases de n'importe quel bouquin bien foutu. Ou sur le Net, par exemple ici :
 
http://www.commentcamarche.net/cpp/cpppoint.php3
 
Je n'ai pas fouillé, tu peux sûrement trouver mieux.
 
"ca a un peut avoir avec le & en C" --> oui pour "int a = 1; int *p = &a" c'est comme en C, non pour le passage par référence


 
en fait, je voulais savoir si on peut travailler sur les adresses avec le &
 
merci pour la ref

n°1580570
aGaB
The prime time of your life
Posté le 28-06-2007 à 22:07:50  profilanswer
 

Bon ben je vais te répondre. Non on ne peut pas travailler avec les adresses pour ce qui est des références, car on ne peut pas modifier l'objet référencé en C++. D'ailleurs une référence doit être immédiatement initialisé
 
Ce code là n'est pas valide

Code :
  1. int a = 10;
  2. int& ref;
  3. ref = a;


 
Celui la l'est

Code :
  1. int a = 10;
  2. int& ref = a;
  3. ref++;
  4. cout<<a<<endl; // affiche 11


 
Mais les références ne sont pas vraiment utilisées comme ça au plein milieu du code.
Le but des références est clairement de remplacer les passages par adresse en C++ dans le cas où celui-ci n'était pas nécessaire, mais imposé. Il permet de créer un code plus clair :).
 
Au final dis-toi que ça n'a pas grand chose à voir avec les adresses (même si c'est le cas implicitement). Une référence c'est juste la pour, en quelque sorte, donner un autre nom à une variable ^^.

n°1580780
in_your_ph​ion
Posté le 29-06-2007 à 13:06:26  profilanswer
 

aGaB a écrit :

Bon ben je vais te répondre. Non on ne peut pas travailler avec les adresses pour ce qui est des références, car on ne peut pas modifier l'objet référencé en C++. D'ailleurs une référence doit être immédiatement initialisé
 
Ce code là n'est pas valide

Code :
  1. int a = 10;
  2. int& ref;
  3. ref = a;


 
Celui la l'est

Code :
  1. int a = 10;
  2. int& ref = a;
  3. ref++;
  4. cout<<a<<endl; // affiche 11


 
Mais les références ne sont pas vraiment utilisées comme ça au plein milieu du code.
Le but des références est clairement de remplacer les passages par adresse en C++ dans le cas où celui-ci n'était pas nécessaire, mais imposé. Il permet de créer un code plus clair :).
 
Au final dis-toi que ça n'a pas grand chose à voir avec les adresses (même si c'est le cas implicitement). Une référence c'est juste la pour, en quelque sorte, donner un autre nom à une variable ^^.


 
 
ok, merci pour ces explications  :D


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C --> C++] passage par référence

 

Sujets relatifs
passage de TStream de Delphi à C++passage de tableau entre fonctions
Flash5 arrêter le défilement au passage de la souris[VBA Excel]Passage d'une variable d'un Userform à un autre
[SHELL SH/BASH] Passage du caractère * en parametrePassage Java/C++ petite question :)
passer une référence à un autre script.[ Résolu ] Problème lors du Passage des Paramètes
Passage HTML -> XHTML[Javascript] Référence à un objet ?
Plus de sujets relatifs à : [C --> C++] passage par référence


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR