Types dérivés
Un type dérivé est créé à partir
de types standards pour l'usage propre à un programme. Les types
dérivés sont les tableaux, les structures et les pointeurs.
* Tableaux et structures
* Pointeurs
Tableaux et structures
Les tableaux sont des paquets de données de même type.
Ils sont reconnus par la présence de crochets ouvrants et fermants
lors de la déclaration de l'objet. La taille du tableau est donnée
lors de la définition entre les crochets. Pour simplifier le travail
du compilateur, le rang des éléments du tableau ne peut évoluer
qu'entre 0 et la taille du tableau -1.
Les structures sont des ensemble de données non homogènes.
Les données peuvent avoir des types différents. Les structures
sont déclarées selon le modèle :
* struct
* un nom de structure facultatif
* {
* la liste des données contenues dans la structure
* }
* la liste des variables construite selon ce modèle.
Prenons pour exemple les définitions suivantes :
int tab[10];
struct st1 {
int a1;
float b1;
long c1;
} objst1;
Dans cet exemple :
1. tab est un tableau de 10 entiers, et
les éléments du tableau sont référencés
par tab[0] jusqu'à tab[9]
;
2. st1 est un nom de modèle de structure et objst1 est un objet
de type struct st1. Les différentes parties de la structure objst1
sont accessibles par objst1.a1, objst1.b1 et objst1.c1.
Les tableaux et les structures sont parfois appelés agglomérats
de données.
Pointeurs
Le pointeur est une variable destinée à contenir une
adresse mémoire. Le compilateur connaissant la taille de l'espace
adressable de la machine, il sait la taille nécessaire pour contenir
un pointeur. Un pointeur est reconnu syntaxiquement par l' *
lors de sa déclaration. Le pointeur est associé à
un type d'objet. Ce type est celui des objets qui sont manipulables grâce
au pointeur. Ce type est utilisé en particulier lors des calculs
d'adresse qui permettent de manipuler des tableaux à partir de pointeurs.
Prenons les déclarations suivantes :
int *ptint;
char *ptchar;
Dans cet exemple, ptint est une
variable du type pointeur sur un entier. Cette variable peut donc contenir
des valeurs qui sont des adresses de variables du type entier (int).
De même, ptchar est une
variable du type pointeur sur un caractère. Elle peut donc contenir
des valeurs qui sont des adresses de variables de type caractère
(char). Le compilateur C vérifie le type des adresses mises
dans un pointeur. Le type du pointeur conditionne les opérations
arithmétiques sur ce pointeur. Les opérations les plus simples
sur un pointeur sont les suivantes :
* affectation d'une adresse au pointeur ;
* utilisation du pointeur pour accéder à l'objet dont
il contient
l'adresse.
Si l'on déclare les variables de la manière suivante
:
int in;
char car;
int *ptint;
char *ptchar;
Un pointeur peut être affecté avec l'adresse d'une variable
ayant un type qui correspond à celui du pointeur :
ptint = ∈
ptc = &car;
Une fois un pointeur affecté avec l'adresse d'une variable,
ce pointeur peut être utilisé pour accéder aux cases
mémoires correspondant à la variable (valeur de la variable)
:
*ptint = 12;
*ptc = 'a';
La première instruction met la valeur entière 12 dans
l'entier in ; la deuxième
instruction met le caractère a dans l'entier car.
En conclusion sur les pointeurs:
Un pointeur est une adresse dans la mémoire de l'ordinateur.
La confusion et souvent le mystère qui règnent autour du
mot pointeur vient du fait qu'à cette adresse on peut trouver presque
n'importe quoi, mais le typage permets d'une part de savoir ce qui s'y
trouve mais aussi de fixer la taille de cet objet.
Pour manipuler les pointeurs il y a 2 caractères spèciaux
& et *.
* désigne
ce qui se trouve à l'adresse contenue dans le pointeur.
& désigne
l'adresse en mémoire d'une variable
Exemples:
int a; /* a est un entier */
int *b; /* b est un pointeur sur un entier
, ie c'est une variable qui peut contenir une adresse. Cette adresse contiendra
un entier */
a=5; /* a vaut 5*/
b=&a; /* b contient l'adresse mémoire
de a, ie *b vaut 5*/
*b=10; /* on range 10 dans l'adresse que
vaut b. Comme b contient l'adresse de a, a vaut 10 */