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 */

 

 


Un exemple de manipulation de pointeurs içi.