En fait, tu n'as pas l'air d'avoir saisi comment fonctionne une fonction.
Posons un peu de code pour avoir de quoi causer:
1 2 3 4 5 6
| int f (int a) {return 2*a;}
int main(void) {
int a = 2;
return f(a);
} |
Transcrivons cela en français.
J'inverse volontairement la lecture de type, pour aider à comprendre les typedef complexes et surtout éviter une erreur avec les pointeurs. Pose la question si tu veux en savoir plus.
Soit un entier, celui retourné par f quand on lui donne un entier a.
La définition de f est:
sachant l'entier a, retourner 2*a;
Soit un entier, celui retourné par main quand on ne lui donne pas d'argument.
La définition de main est:
Soit un entier a de valeur 2;
Retourner la valeur de f pour la valeur courante de a.
Concrêtement, j'ai choisi int comme type d'argument, mais j'aurai pu prendre autre chose.
Dans tous les cas, le code produit par le compilateur est fonctionnellement équivalent à ceci:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| //appeler main
int a = 2;
//évaluation de return f(a);
//création du premier argument de la fonction int f(int), en l'initialisant avec la valeur passé en argument
int a@"int f(int)" = a;
//appel de f(a):
//création de la valeur de retour de l'appel de fonction
int temp = 2*a@"int f(int)";
//fin de l'appel de f
//destruction de a@"int f(int)"
//continuation de l'évaluation de return f(a);
return temp; |
Si tu avais choisis une structure comme argument, ca ferai pareil:
à l'appel de la fonction, une structure est créée, en copiant celle passée en argument.
à la sortie de l'appel de la fonction, la structure copiée est détruite (puisque c'était une temporaire pour l'appel de la fonction).
1 2 3 4 5 6 7 8 9
| struct Bidule {int valeur;}
int f (struct Bidule a) {return 2*a.valeur;}
int main(void) {
struct Bidule a = {2;}
return f(a);
} |
Dans ce code, en appelant f(a), on crée un Bidule temporaire, copie de a trouvé dans main.
C'est à ce moment là qu'on risque de te parler de pointeur, de passage par référence, et de pointeur vers une constante.
L'idée sera de ne pas copier la structure, mais d'utiliser directement son adresse en mémoire.
Mais la encore, c'est un détail pour cette explication. Tu en auras par contre besoin si tu veux pouvoir modifier la structure de l'appelant depuis la fonction appelée.
Partager