Transmission d'une structure en paramètre (argument)
Transmission de la valeur d'une structure
Aucun problème particulier ne s'oppose, il s'agit tout simplement d'appliquer ce que nous connaissons déjà.
Exemple:
#include< stdio.h >
struct enreg {
int a;
float b;
};
main()
{
struct enreg x;
void fct(struct enreg)
x.a=1; x.b=12.5;
printf("Après appel de fct: %d, %e", x.a, x.b);
fct(x);
printf("Après apel de fct: %d, %e", x.a, x.b);
return 0;
}
void fct(struct enreg S) {
S.a=0;
S.b=1;
printf("Dans fct: %d, %e", S.a, S.b);
{
Les résultats affichés sont:
avant appel de fct: 1, 12.5
dans fct: 0, 1
après appel de fct: 1, 12.5
Naturellement les valeurs de x sont recopiées localement dans la fonction fct lors de sont appel. Les modifications de S au sein de fct n'ont aucune incidence sur les valeurs de x.
Transmission de l'adresse d'une structure
L'appel de fct devient fct(&x), cela signifie que l'en-tête devient void fct(struct enreg *S).
Ici le problème se pose lors de l'accès à chaque champ de la structure S.
L'opérateur "." ne convient plus, deux solutions s'offrent:
- On peut utiliser la notation (*S).a et (*S).b pour désigner chaque champ de la structure d'adresse S
- On peut faire appel à un nouvel opérateur noté →, lequel permet d'accéder aux différents champs d'une structure à partir de son adresse de début.
On aura:
S→a = (*S).a
S→b = (*S).b
Notre programme devient alors:
#include< stdio.h >
struct enreg {
int a;
float b;
} ;
main()
{
struct enrteg x;
void fct(struct enreg);
x.a=1;
x.b=12.5;
printf("Avant appel de fct: %d, %e", x.a, x.b);
fct(&x);
printf("Après appel de fct: %d, %e", x.a, x.b);
return 0;
}
void fct (struct enreg *S) {
S → a=0;
S → b=1;
printf("\n Dans fct, %d %e", S→a, S→b);
}