Programmer en langage C
176
© Éditions Eyrolles
Comme vous le constatez, le problème se pose alors d’accéder, au sein de la définition de fct,
à chacun des champs de la structure d’adresse ads. L’opérateur « . » ne convient plus, car il
suppose comme premier opérande un nom de structure et non une adresse. Deux solutions
s’offrent alors à vous :
●
adopter une notation telle que (*ads).a ou (*ads).b pour désigner les champs de la
structure d’adresse ads ;
●
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. Ainsi, au sein de fct, la notation ads -> b
désignera le second champ de la structure reçue en argument ; elle sera équivalente à
(*ads).b.
Voici ce que pourrait devenir notre précédent exemple en employant l’opérateur noté -> :
Transmission en argument de l’adresse d’une structure
#include
struct enreg { int a ;
float b ;
} ;
main()
{
struct enreg x ;
void fct (struct enreg *) ;
x.a = 1; x.b = 12.5;
printf ("\navant appel fct : %d %e",x.a,x.b);
fct (&x) ;
printf ("\nau retour dans main : %d %e", x.a, x.b);
}
void fct (struct enreg * ads)
{
ads->a = 0 ; ads->b = 1;
printf ("\ndans fct : %d %e", ads->a, ads->b);
}
avant appel fct : 1 1.25000e+01
dans fct : 0 1.00000e+00
au retour dans main : 0 1.00000e+00
Delannoy Livre.book Page 176 Mercredi, 6. mai 2009 4:26 16
176
© Éditions Eyrolles
Comme vous le constatez, le problème se pose alors d’accéder, au sein de la définition de fct,
à chacun des champs de la structure d’adresse ads. L’opérateur « . » ne convient plus, car il
suppose comme premier opérande un nom de structure et non une adresse. Deux solutions
s’offrent alors à vous :
●
adopter une notation telle que (*ads).a ou (*ads).b pour désigner les champs de la
structure d’adresse ads ;
●
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. Ainsi, au sein de fct, la notation ads -> b
désignera le second champ de la structure reçue en argument ; elle sera équivalente à
(*ads).b.
Voici ce que pourrait devenir notre précédent exemple en employant l’opérateur noté -> :
Transmission en argument de l’adresse d’une structure
#include
struct enreg { int a ;
float b ;
} ;
main()
{
struct enreg x ;
void fct (struct enreg *) ;
x.a = 1; x.b = 12.5;
printf ("\navant appel fct : %d %e",x.a,x.b);
fct (&x) ;
printf ("\nau retour dans main : %d %e", x.a, x.b);
}
void fct (struct enreg * ads)
{
ads->a = 0 ; ads->b = 1;
printf ("\ndans fct : %d %e", ads->a, ads->b);
}
avant appel fct : 1 1.25000e+01
dans fct : 0 1.00000e+00
au retour dans main : 0 1.00000e+00
Delannoy Livre.book Page 176 Mercredi, 6. mai 2009 4:26 16
