Pointeurs et types composés

Pointeurs sur données de types struct ou union

Il existe des pointeurs sur tout type de données. Dans la section sur les types composés, nous avons manipulé des structures et des unions. Pour accéder aux champs de ces types composés, nous avons utilisé l'opérateur point '.'.

Pour accéder à un champ d'une structure désignée par un pointeur, il faut accéder à la structure pointée à l'aide de l'opérateur '*', puis appliquer l'opérateur accès au champ '.'.

Prenons le cas de la structure et du pointeur suivants :

  struct _maStruct {

    int a;

    double b;

  } maStruct , *ms_ptr=&maStruct;

Nous écrivons pour accéder au champ a : *ms_ptr.a.

Mais cette écriture ne marche pas à cause de la définition des priorités d'opérateurs. L'opérateur . ayant une priorité supérieure à celle de l'opérateur *. Il est appliqué sur le vecteur ms_ptr qui n'est ni une structure, ni une union. Il y a erreur !

La solution est :

  • Une modification de la priorité des opérateurs par l'utilisation des parenthèses : (*ms_ptr).a.

  • L'utilisation d'un opérateur adapté : '->'.

Cet opérateur « flèche droite » composé du tiret haut '-' et du symbole supérieur '>' : « -> » est mis en œuvre dans l'exemple qui suit  :

1
  typedef struct _MaStructure {
2
    int a;
3
    double b;
4
  } MaStructure;
5
int main() {
6
  MaStructure ms = { .a = 42, .b = 42.0 } ;
7
  MaStructure *ms_ptr = &ms ;
8
  printf("%d %lf\n", ms_prt->a, ms_ptr->b) ;
9
  printf("%d %lf\n",(*ms_prt).a, (*ms_ptr).b) ;
10
  return 0;
11
}

Puis, un appel à printf permet d'afficher les valeurs des champs de la structure, via le pointeur. On voit qu'on utilise l'opérateur -> au lieu du point.

Remarque

Ce programme comprend :

  • Une déclaration d'un type MaStructure qui est une structure composée d'un entier et d'un double,

  • Une déclaration avec initialisation d'une variable ms du type ci-dessus,

  • Une déclaration de pointeur ms_ptr sur une valeur du type MaStructure et initialisation avec l'adresse de ms,

  • 2 instructions printf qui afficheront 2 lignes identiques : la première utilisant l'opérateur -> et la seconde les 2 opérateurs * et ..

On voit que l'opérateur -> est plus pratique que l'utilisation conjointe des 2 autres. Il peut toutefois exister des cas de configuration de données où l'emploi des 2 opérateurs se révélera utile.