next up previous contents index
Next: Représentation unidimensionnelle des matrices Up: No Title Previous: Passage par référence (2)

Pointeurs et tableaux

     

Ces deux types de données présentent des similarités et des différences importantes. Si l'on définit

int t[4];
int *p;

il y a allocation de mémoire pour 4 entiers dans le premier cas, mais pas d'allocation dans le second. On a vu cependant que la valeur de t était l'adresse du bloc alloué. On peut donc affecter cette adresse à p :

p = t;

Après cette affectation, les deux expressions *p et t[0] ont la même valeur. L'affectation inverse t = p; est illégale car t est une constante, pas une variable. Au niveau des valeurs, pointeurs d'int et tableaux d'int sont de même type.

   figure1915
Figure: Affectation d'un tableau à un pointeur

Si l'on a une fonction sur les tableaux

void f(int[]);

on peut l'appeler avec un pointeur en argument : f(p). Inversement, une fonction sur des pointeurs

void g(int *);

peut être appelée avec un tableau en argument : g(t).   Ces deux déclarations de fonctions sont donc équivalentes.

L'accès par indexation à un tableau (unidimensionnel) s'applique également à un pointeur : on peut écrire p[2] comme t[2]. L'adresse de p[2], comme celle de t[2], est fonction de la valeur de p et de la taille (en octets) des éléments du tableau, qui est déterminée par le type qui apparaît dans la définition de p comme de t.

double t[4];
double *p = &t[1];

La valeur de p est une adresse, celle du deuxième élément du tableau t, mais le type de p est << pointeur de double >> ; cela permet, par exemple, de calculer l'adresse de p[2], qui est celle de t[3].

   figure1944
Figure: Pointeur sur un élément d'un tableau



Rene Lalement
Mon Sep 30 18:22:54 MET 1996