.)

Cours 12.3. Structures et pointeurs

Pointeurs de structure

Les pointeurs de structure fonctionnent sur la même syntaxe que les variables :

struct vector v;
struct vector * adresse = &v;

Le pointeur contiendra l'adresse du premier champs de la structure. Lorsque l'on incrémente un pointeur de structure, on avance le pointeur de la taille de la structure (qui n'est pas forcement égale à la somme des tailles des champs).

Accès aux champs

L'accès aux champs de la structure peut se faire avec la syntaxe classique des pointeurs en respectant la priorité des opérateurs :

(*ptr).champ

Mais il existe une syntaxe plus conviviale qui utilise l'opérateur -> :

ptr->champ

Cette syntaxe est à privilégier, mais ne peut être utilisée qu'avec un pointeur de structure.

Remarque : cette syntaxe est importante car elle est très utilisée en C++ pour les pointeurs de classe. Une classe en C++ est une extension des structures en C qui contient des fonctions en plus des champs.

Exemple

Le code suivant crée un pointeur de structure et affecte une valeur à chaque champ selon les deux syntaxes présentées ci-dessus :

// Déclare un vecteur et un pointeur de vecteur
struct vector vec;
struct vector * ptr = &vec;

// Syntaxe des pointeurs classiques
(*ptr).x = 1.2;

// Syntaxe des pointeurs de structure
ptr->y = 2.4;

Exercices

Exercice 1

Ecrire le code de la fonction homothetie() qui réalise une homothètie d'un pointeur de sur un vecteur passé en argument. Le second paramètre de la fonction est le facteur d'homothétie. Pour rappel, l'homothétie d'un vecteur \( \vec{v} \) et de facteur \(h\) est donnée par :

$$ \vec{V} = h \times \vec{v} $$

Voici la sortie escomptée :

Avant : x=1.2 y=3.4
Après : x=2.4 y=6.8

Exercice 2

On fournit le code suivant qui récupère l'heure courante locale dans la structure timeinfo (de type struct tm). En vous référant à la documenation, de la structure tm complétez le programme pour qu'il affiche l'heure.

// Source : http://www.cplusplus.com/reference/ctime/localtime/
// Récupère l'heure locale dans timeinfo
time_t rawtime;
struct tm * timeinfo;

time (&rawtime);
timeinfo = localtime (&rawtime);

Voici un affichage possible :

15:49 29s

Quiz

Un pointeur de structure pointe vers ...

Vérifier Bravo ! Le pointeur d'une structure pointe vers l'adresse du premier champs. Essaie encore ...

Quelles syntaxes permettent d'accéder au champ d'un pointeur de structure ?

struct article * ptr;
Vérifier Bravo ! Il faut effectivement veiller à la priorité des opérateurs. Essaie encore ...

Quelles syntaxes permettent d'accéder au champ d'un pointeur de structure ?

struct article * ptr;
Vérifier Bravo ! Cette syntaxe est à privilégier. Essaie encore ...

Lorsque l'on incrémente un pointeur de structure ...

Vérifier Bravo ! N'oubliez pas que la taille de la structure n'est pas nécessairement la somme de la taille de ses champs. Essaie encore ...

Voir aussi


Dernière mise à jour : 03/12/2022