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

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

Marsh Posté le 26-06-2007 à 09:42:30    

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:

Reply

Marsh Posté le 26-06-2007 à 09:42:30   

Reply

Marsh Posté le 26-06-2007 à 11:24:44    

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.
 

Reply

Marsh Posté le 26-06-2007 à 11:25:49    

ouvre un livre.

Reply

Marsh Posté le 26-06-2007 à 11:48:04    

Taz a écrit :

ouvre un livre.


 
Oui, aussi.

Reply

Marsh Posté le 26-06-2007 à 12:07:11    

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...)

Reply

Marsh Posté le 26-06-2007 à 17:22:19    

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

Reply

Marsh Posté le 26-06-2007 à 17:28:21    

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)

Reply

Marsh Posté le 26-06-2007 à 17:52:06    

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; }

Reply

Marsh Posté le 26-06-2007 à 18:05:52    

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

Reply

Marsh Posté le 26-06-2007 à 20:38:51    

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
 

Reply

Marsh Posté le 26-06-2007 à 20:38:51   

Reply

Marsh Posté le 26-06-2007 à 23:24:52    

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

Reply

Marsh Posté le 26-06-2007 à 23:30:08    

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

Reply

Marsh Posté le 28-06-2007 à 22:07:50    

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 ^^.

Reply

Marsh Posté le 29-06-2007 à 13:06:26    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed