Les tableaux et les pointeurs

Un tableau permet de regrouper plusieurs éléments d'un même type. Nous verrons plus en détail comment les tableaux sont gérés par le compilateur C. Pour l'instant nous ne traiterons que de la vision qu'en a un simple programmeur. Un tableau se déclare en donnant, après la déclaration de la variable, le nombre d'éléments :

int tableau[100];

crée un tableau de 100 éléments de type entier. La numérotation commence à 0. Le premier élément est tableau[0] et par conséquent le dernier est tableau[99].

ATTENTION : l'élément tableau[100] n'existe pas et le C ne teste pas si les limites d'un tableau sont dépassées. Si un programme rencontre cette instruction, une erreur grave peut se produire, mais le programme peut aussi continuer à tourner. Dans ce dernier cas la modification peut porter sur une autre variable. Il sera alors très dur de trouver la cause de l'erreur.

On portera une attention particulière aux tableaux de caractères :

char text[100] = "blablablabla";

qui permettent de définir les chaînes de caractères qui seront affichées par le C.

Le schéma ci-dessus explique comment le compilateur gère cette déclaration. Il attribue deux zones mémoires : une de 32 bits qu'il appellera txt, et une de 100 octets (correspondant à la taille demandée). L'adresse de cette zone sera mise dans la zone attribuée à txt. La séquence de texte donnée à l'initialisation de la variable est recopiée dans cette zone. La séquence est terminée par un caractère nul.
Cette séquence peut être reconstruite instruction par instruction. Dans un premier temps une variable de type «pointeur» est créée. Un pointeur ne contient pas directement une valeur exploitable par le programme mais l'adresse d'une zone mémoire contenant des données exploitables. Un pointeur est défini en intercalant entre le type et le nom de la variable le caractère *.

exemple :
char* txt;

Déclarer un pointeur ne veut en aucune manière dire que l'on a réservé de la place pour socker des données. Le compilateur a juste créé un emplacement dans lequel sera rangée l'adresse. L'utilisation d'un pointeur non initialisé aura pour effet de planter le programme.
Une méthode pour avoir une adresse pour remplir le contenu du pointeur consiste à demander au système d'exploitation une zone de mémoire qui sera propre au programme. Le système d'exploitation s'engage à n'attribuer cet espace qu'au demandeur. Sous Unix l'appel système qui permet de s'attribuer une zone mémoire s'apelle malloc pour memory allocation. Cet appel système prend comme argument la taille de la zone à attribuer et retourne son emplacement.

Exemple :
txt = malloc(100);

Il est par conséquent possible de faire pointer deux pointeurs sur la même zone.

char txt[100] = "blablablabla";
char *txt2;

   txt2 = txt;
donnera le résultat suivant :

Si par l'intermédiaire de l'un des deux pointeurs, la chaîne de caractère est modifiée, la modification sera aussi visible par l'autre pointeur.

Il est aussi possible de faire un pointeur vers un tableau d'autres éléments que des caractères. Par exemple :
int ptr[7];

donne la structure suivante :

Si le type entier est remplacé par un autre type, à la place d'un tableau de 7 entiers, on aura un tableau de 7 autres éléments. Ceci est particulièrement vrai pour le type pointeur. Ainsi :
char* ptr[7];
déclare la variable ptr comme un pointeur vers un tableau de pointeurs qui pointent vers des chaines de caractères.

Si l'on ne s'interesse pas à la gestion de la mémoire la déclaration char* txt[7] peut être réduite à char** txt. Le C et Unix s'en serviront pour communiquer les paramètres fournis par l'utilisateur au démarrage de programme.

Unix fournit à la fonction main le nombre d'arguments que l'utilisateur a tapé, qui sera stocké dans la variable argc puis un tableau contenant les différents arguments que l'utilisateur a tapé. Il sera stocké dans le pointeur argv.

main(int argc, char** argv)
{

exercice 1


Ecrire un programme affarg0 qui affiche l'argument 0 qui lui est passé en paramètre.



De petits exercices sur les tableaux


De petits exercices sur les pointeurs

Suite : Les Entrées-Sorties


Menu Principal