Eléments de base du langage C - Transmission d'une structure en paramètre

Index de l'article


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);

 

}