Quelles différences entre ces 3 définitions d'une fonction qui permute les valeurs des deux variables ?
fct(int *, int *);
fct(int &, int &);
fct(int a, int b);
Merci![]()
Quelles différences entre ces 3 définitions d'une fonction qui permute les valeurs des deux variables ?
fct(int *, int *);
fct(int &, int &);
fct(int a, int b);
Merci![]()
La première prend 2 pointeurs, la deuxième 2 références et la troisième 2 valeurs.
Seules les 2 premières fonctions peuvent échanger les valeurs de 2 entiers, mais franchement, là, on peut faire aussi beaucoup de bêtises avec simplement les prototypes, sans savoir ce que font chacune des fonctions !
Donc on ne peut pas faire
comme en pascal ? ca donne quoi au juste ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 void fct(int a, int b); { int c; c=a; a=b; b=c; }
Tu peux le faire, mais ca n'echangera pas les valeurs de a et b.
Lors de l'appel a la fonction a et b sont "copiés" et reprennent leur valeur d'origine lorsque l'appel se termine.
C'est pour cela que pour echanger deux valeurs, on passe deux pointeurs sur ces valeurs.
Mais que représente *a ? une valeur ou un pointeur ? et c ?
???
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 void fct (int * a, int * b) {int c; c=*a; *a=*b; *b=c;
*a correspond a la valeur qui se trouve à l'adresse pointée par ton pointeur a.Mais que représente *a ?
a possède l'adresse de ta variable pointée.
exemple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 int c = 5; int *a = &c; /*a pointe sur la variable c, elle possède son adresse et *a = 5 */ *a = 10; /*c vaut maintenant 10*/![]()
T'as déjà jeté un oeil sur un cours de C ou de C++ et dans la FAQ ?Envoyé par GO
dans ce cas la, la valeur des variables que tu passes en parametres est copiée dans la fonction. donc tout ce qui se passe est interne a la fonction, et n'a pas de consequence sur le variables d'origine. donc ta fonction n'aura aucun effet.
Mais ... c'est exactement comme en Pascal. On ne me la fait pas!Envoyé par GO
En Pascal tu disais explicitement au compilateur que tu désirais passer ton paramètre par référence (-> "var"), en C++ tu passes une référence (-> "&"), en C tu passes un pointeur par valeur (-> "*")(marche aussi en C++), en Ada tu déclares ton paramètre [in,out], idem pour Corba & COM, en Java tu ne fais pas avant l'auto-boxing du Java 1.5, ...
J'ai l'étrange impression que tout le monde a fait tes exos, alors que la réponse est en clair dans quantité de cours de C++![]()
Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...
On transmet par pointeurs, c'est à dire que les deux pointeurs pointe sur l'adresse des deux variables à permuter.
Code : Sélectionner tout - Visualiser dans une fenêtre à part fct(int *, int *);
On peut donc modifier ces valeurs en usant de l'utilisation des pointeurs.
On transmet par référence. On ne pointe donc pas sur l'adresse des deux variables à permuter, mais ici la référence correspond à la variable elle même. Ceci implique aucune copie des variables lors de la transmission par référence des paramètres.
Code : Sélectionner tout - Visualiser dans une fenêtre à part fct(int &, int &);
On recopie seulement les valeurs à permuter dans deux autres variables que l'on transmet en pramètre, d'ou le fait que modifier celles ci ne modifiera pas les variables désirées.
Code : Sélectionner tout - Visualiser dans une fenêtre à part fct(int a, int b);
Après exécution de cette fonction, il n'y aura pas eu de permutations avec les valeurs que tu as fait passé dans ta fonction mais seulement avec celles utilisées dans ta fonction fct.Donc on ne peut pas faire
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 void fct(int a, int b); { int c; c=a; a=b; b=c; }![]()
Partager