Eléments de base du langage C

Parent Category: Informatique et réseaux Category: Programmation C

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

 

}