OVH Cloud OVH Cloud

difference entre reference et pointeur ?

35 réponses
Avatar
news.free.fr
bonjour , je cherche a savoir quel est la différence entre une passage par
référence et un passage par adresse.

Je sais ce qu'est un pointeur , mais c'est le pourquoi on a ajouté le
passage par référence au c++ alors qu'il existé deja la passage par adresse.

y a til des choses que le passage par référence peut faire que le passage
par adresse nepeut pas ?

merci a vous

Laurent

10 réponses

1 2 3 4
Avatar
Andre Heinen
On Mon, 22 Nov 2004 16:32:32 +0100, Arnaud Meurgues
wrote:

Andre Heinen wrote:

Si une fonction modifie son argument, certains programmeurs
trouvent qu'il vaut mieux utiliser un pointeur parce que ça rend
plus explicite le fait que la fonction peut modifier l'argument.
Par exemple f(&i).
D'autres programmeurs utilisent des références mais choisissent
un nom de fonction explicite, par exemple modifier(i).


On utilise plutôt "const" pour signifier qu'on ne va pas modifier le
paramètre :

f(const <type> &i)


En fait, je ne voulais pas parler des déclarations ou
définitions, mais des appels. "const" n'apparaît pas dans
l'appel de fonction.

--
Andre Heinen
My address, rot13-encoded: n qbg urvara ng rhebcrnayvax qbg pbz


Avatar
kanze
Pierre Maurette wrote in message
news:...

Je ne vois pas d'exemple de passage par reference qui ne pourrait pas
être résolus de façon traditionnelle par un pointeur (mais ça doit
bien exister).


Les opérateurs surchargés. Et comme paramètre, et comme valeur de rétour
(de l'opérateur[], par exemple).

--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Avatar
Andre Heinen
On 22 Nov 2004 18:55:36 +0100, Gabriel Dos Reis
wrote:

Andre Heinen writes:

| Il est garanti qu'une référence "pointe" toujours sur quelque
| chose.

int& f() { int i = 0; return i; }
int main() { int& r = f(); return r; }


Oups, effectivement. Reprenons:

1) il est plus facile de se retrouver avec un pointeur invalide
qu'avec une référence invalide;

2) si on a besoin de la valeur nulle les références ne
conviennent pas.

--
Andre Heinen
My address, rot13-encoded: n qbg urvara ng rhebcrnayvax qbg pbz

Avatar
Marc Boyer
In article <41a261df$0$8197$, Loïc Joly wrote:
Marc Boyer wrote:

news.free.fr wrote:

Je sais ce qu'est un pointeur , mais c'est le pourquoi on a ajouté le
passage par référence au c++ alors qu'il existé deja la passage par adresse.



Pourquoi pas ?
On peut tout faire avec une boucle do {} while(); et pourtant on
a ajouté un repeat et un for.
^^^^^^

Ah bon ? ;)


Désolé, je navigue entre trop de langages: en algo, on présente
repeat [until], while et for.

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.



Avatar
Marc Boyer
In article , Fabien LE LEZ wrote:
On 22 Nov 2004 11:19:35 GMT, Marc Boyer
:

On peut tout faire avec une boucle do {} while();


C'est marrant, tu cites là la structure de boucle la moins utilisée,
de très loin.


Vague souvenir d'info théo où on part d'un langage avec un boucle
et la condition, et ou on fait tout le reste avec.
Dans mon souvenir, on partait d'un repeat/until, mais je
suis plus tout à fait sur.

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.


Avatar
Pierre Maurette
Marc Boyer a écrit:

In article <41a261df$0$8197$, Loïc Joly wrote:
Marc Boyer wrote:

news.free.fr wrote:

Je sais ce qu'est un pointeur , mais c'est le pourquoi on a ajouté le
passage par référence au c++ alors qu'il existé deja la passage par adresse.



Pourquoi pas ?
On peut tout faire avec une boucle do {} while(); et pourtant on
a ajouté un repeat et un for.
^^^^^^

Ah bon ? ;)


Désolé, je navigue entre trop de langages: en algo, on présente
repeat [until], while et for.
#define repeat do

#define until(x) while(!(x))
;-)
--
Pierre




Avatar
Pierre Maurette
a écrit:

Pierre Maurette wrote in message
news:...

Je ne vois pas d'exemple de passage par reference qui ne pourrait pas
être résolus de façon traditionnelle par un pointeur (mais ça doit
bien exister).


Les opérateurs surchargés. Et comme paramètre, et comme valeur de rétour
(de l'opérateur[], par exemple).
L'opérateur [], je ne vois pas trop une reference en paramètre. En

revanche << et >> seraient peut-être un meilleur exemple ?

Il me semble que le retour d'une reference est utile et a du sens même
dans le cas d'une fonction globale. Ce qui me semble inutile, c'est le
passage d'une reference en paramètre d'une fonction globale.
(j'appelle fonction globale une fonction ne faisant pâs partie d'une
classe).
--
Pierre


Avatar
Marc Boyer
In article , Pierre Maurette wrote:
a écrit:

Pierre Maurette wrote in message
news:...

Je ne vois pas d'exemple de passage par reference qui ne pourrait pas
être résolus de façon traditionnelle par un pointeur (mais ça doit
bien exister).


Les opérateurs surchargés. Et comme paramètre, et comme valeur de rétour
(de l'opérateur[], par exemple).
L'opérateur [], je ne vois pas trop une reference en paramètre.



Non, mais en valeur de retour.
Comment faire
std::vector<int> v;
...
v[0]= 1;
sans référence ?

Et tout simplement:
cout<<"i= "<<i;

Il me semble que le retour d'une reference est utile et a du sens même
dans le cas d'une fonction globale. Ce qui me semble inutile, c'est le
passage d'une reference en paramètre d'une fonction globale.
(j'appelle fonction globale une fonction ne faisant pâs partie d'une
classe).


Ben, un retour devient parfois lui même un paramètre ;-)

Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.



Avatar
Pierre Maurette
Marc Boyer a écrit:
[...]
Les opérateurs surchargés. Et comme paramètre, et comme valeur de rétour
(de l'opérateur[], par exemple).
L'opérateur [], je ne vois pas trop une reference en paramètre.



Non, mais en valeur de retour.
Comment faire
std::vector<int> v;
...
v[0]= 1;
sans référence ?
OK, ça c'est clair depuis plusieurs messages.


Il me semble que le retour d'une reference est utile et a du sens même
dans le cas d'une fonction globale. Ce qui me semble inutile, c'est le
passage d'une reference en paramètre d'une fonction globale.
(j'appelle fonction globale une fonction ne faisant pâs partie d'une
classe).


Ben, un retour devient parfois lui même un paramètre ;-)
Quand on reçoit une reference en retour, on peut passer directement sa

valeur ou son adresse:

int& ChoisirVariable(int* var1, int* var2, bool choix)
{
return(choix?*var1:*var2);
}
...
ChoisirVariable(&i, &ChoisirVariable(&j, &k, true), false) = 123;
// j = 123;

;-)
--
Pierre



Avatar
Marc Boyer
In article , Pierre Maurette wrote:
Marc Boyer a écrit:
[...]
Les opérateurs surchargés. Et comme paramètre, et comme valeur de rétour
(de l'opérateur[], par exemple).
L'opérateur [], je ne vois pas trop une reference en paramètre.



Non, mais en valeur de retour.
Comment faire
std::vector<int> v;
...
v[0]= 1;
sans référence ?
OK, ça c'est clair depuis plusieurs messages.



OK, dès lors, on a introduit un nouveau (constructeur de) type
dans le système de types.
Alors, pourquoi l'interdire comme paramètre ? Comment batir
un système de type cohérent en rajoutant cette contrainte ?

Il me semble que le retour d'une reference est utile et a du sens même
dans le cas d'une fonction globale. Ce qui me semble inutile, c'est le
passage d'une reference en paramètre d'une fonction globale.
(j'appelle fonction globale une fonction ne faisant pâs partie d'une
classe).


Ben, un retour devient parfois lui même un paramètre ;-)
Quand on reçoit une reference en retour, on peut passer directement sa

valeur ou son adresse:

int& ChoisirVariable(int* var1, int* var2, bool choix)
{
return(choix?*var1:*var2);
}
...
ChoisirVariable(&i, &ChoisirVariable(&j, &k, true), false) = 123;
// j = 123;


ostream& operator<<(ostream* os, int i);
ostream& operator<<(ostream* os, const char s[]);

&(&(&(cout<<"i= ")<<i)<<" j= ")<<j;


Marc Boyer
--
Je ne respecte plus le code de la route à vélo depuis une double fracture
due au fait que j'étais le seul à le respecter.




1 2 3 4