question de débutant sur les fonctions... [ALGO] - Programmation
Marsh Posté le 15-04-2002 à 21:55:15
Passage par valeur : on fais une copie de la valeur de la variable ailleurs en mémoire, pour ne pas "abîmer" sa valeur d'origine.
Passage par référence/adresse : au lieu de passer sa valeur on passe l'adresse où trouver la valeur dans la mémoire, et donc on peut aller la modifier.
Marsh Posté le 15-04-2002 à 21:58:20
Le passage par valeur te permet de transmettre à ta fonction une copie de ta variable. Toutes les opérations que tu feras dessus ne la modifieront pas, mais modifieront seulement sa copie.
Le passage par référence transmet à ta fonction l'adresse mémoire de ta variable. Donc, tu pourras accéder directement au contenu de ta variable par le biais de cette adresse.
Exemple de passage par valeur :
void ParValeur(int var)
{
var += 5;
}
void main(void)
{
int mavar = 4;
ParValeur(mavar);
printf("%d\n",mavar);
}
A l'éxécution, tu t'apercevras que mavar vaut 4 et non 9, car on a transmis une copie de mavar à la fonction ParValeur, par conséquent, toute modif faite dans cette fonction n'est pas répercutée dans la fonction main()
Par référence :
void ParRef(int *var)
{
*var += 5;
}
void main(void)
{
int mavar = 4;
ParRef(&mavar);
printf("mavar = %d\n", mavar);
}
Ici, mavar t'affichera la valeur 9, car on a transmis l'adresse de mavar (via l'opérateur &). Donc la fonction ParRef agit directement sur le contenu de cette adresse, qui est la valeur de mavar. Donc cette valeur est directement modifiée.
En espérant avoir été assez clair. Je te conseille de voir un cours sur les pointeurs si tout ceci te parait obscur
A+
[jfdsdjhfuetppo]--Message édité par Harkonnen--[/jfdsdjhfuetppo]
Marsh Posté le 15-04-2002 à 22:04:05
et du coup, le passage par ref est plus rapide que par valeur dès qu'on utilise des variables plus grandes que la taille d'un pointeur (ie des structures, des classes, etc).
Marsh Posté le 15-04-2002 à 22:19:21
oups...
merci bcp pour ton exemple harkonnen mais il est en C et moi je travaille en Java donc le coup du pointeur ça me dit pas grand chose (ki à dit que java était bien pour commencer la prog )
Je comprends à peu près les explications mais si qq pouvait me filer un exemple en java ce serait sympaaa
Enfin là avec vos posts je crois que j'ai saisi quand même
[jfdsdjhfuetppo]--Message édité par Roco--[/jfdsdjhfuetppo]
Marsh Posté le 15-04-2002 à 22:25:04
à je viens de comprendre le truc avec l'exemple d'harkonnen et un exemple de mon bouquin :
import java.io.*;
import java.lang.Integer;
class MinMax {
public static void main(String []args) {
int a, b;
Entier mon_min, mon_max;
System.out.print("a = " );
a = lire();
System.out.print("b = " );
b = lire();
mon_min = new Entier();
mon_max = new Entier();
System.out.println(" a = "+a+" b = "+b+" mon_min = "+mon_min+" mon_max "+mon_max);
MinMax(a, b, mon_min, mon_max);
System.out.println(" a = "+a+" b = "+b+" mon_min = "+mon_min+" mon_max "+mon_max);
System.out.println();
mon_min.adresse();
System.out.println();
}
public static void MinMax(int nb1, int nb2, Entier min, Entier max) {
if (nb1 < nb2) {
min.egale(nb1);
max.egale(nb2);
}
else {
min.egale(nb2);
max.egale(nb1);
}
nb1 = 0;
nb2 = 0;
}
static private int lire() {
String chaine = new String();
System.out.print("Entrez une valeur : " );
chaine = lireClavier();
System.out.println();
return (new Integer(chaine).intValue());
}
static private String lireClavier() {
byte[] lu = new byte[50];
try {
System.in.read (lu,0,50);
}
catch (IOException e) {
System.out.print("Erreur dans la saisie" );
}
String s = new String(lu,0,50);
return s.trim();
}
}
Donc ici a et b sont passé par valeur et mon_min et mon_max par référence d'ou mon_min et mon_max change de valeur à la fin du prog et a et b ne change pas de valeurs...
en fait en java le passage par référence ne se fait bien qu'avec des objets
Marsh Posté le 15-04-2002 à 22:30:54
Roco a écrit a écrit : en fait en java le passage par référence ne se fait bien qu'avec des objets |
ne l'oublie jamais !
Marsh Posté le 15-04-2002 à 22:31:48
youdontcare a écrit a écrit : et du coup, le passage par ref est plus rapide que par valeur dès qu'on utilise des variables plus grandes que la taille d'un pointeur (ie des structures, des classes, etc). |
En Pascal le "const" fait un passage par référence mais interdit de modifier la variable. Est-ce qu'en C c'est pareil ? Je ne me souviens plus
const / var / out : passage par référence
par défaut : passage par valeur
Marsh Posté le 15-04-2002 à 22:32:08
Citation : ki à dit que java était bien pour commencer la prog |
c clair.... en espérant que ça serve de leçon à ceux qui conseillent le Java comme premier langage... on a beau penser ce qu'on veut des pointeurs, c quand même le B-A BA...
Citation : en fait en java le passage par référence ne se fait bien qu'avec des objets |
oui, et avec des tableaux aussi
A noter : le C# permet de passer des paramètres de tout type par référence, grace au mot clé ref
Comme quoi C# n'est pas une simple repompe de Java...
A+
[jfdsdjhfuetppo]--Message édité par Harkonnen--[/jfdsdjhfuetppo]
Marsh Posté le 15-04-2002 à 22:34:47
antp a écrit a écrit : En Pascal le "const" fait un passage par référence mais interdit de modifier la variable. Est-ce qu'en C c'est pareil ? Je ne me souviens plus const / var / out : passage par référence par défaut : passage par valeur |
vi c pareil en C pour const
Marsh Posté le 15-04-2002 à 21:47:41
Hi
Vous allez vraiment me prendre pour une tâche (hein quoi c'est déjà le cas ) mais bon tant pis :
Je ne comprends pas très bien la différence entre la passage par référence et le passage par valeur dans la transmission de paramètres à une fonction.
En fait je crois que je l'utilise instictivement sans vraiment bien comprendre... et puis je crois qu'en Java, le passage se fait essentiellement par valeur (sauf dans le cas d'un objet où le passage se fait alors par référence).