14.1. Relation nom de tableau ‐ pointeur

Icône de l'outil pédagogique Relation nom de tableau ‐ pointeur

 

On rappelle que le nom d'un tableau tab représente l’adresse du début du tableau (il n'est pas utile de le faire précéder de &) : la notation tab équivaut à &tab[0].

En réalité, le Langage C considère l'identificateur du tableau comme une constante de type pointeur sur les éléments du tableau. Les notations suivantes sont alors équivalentes :

tab est équivalent à &tab[0]
tab+i est équivalent à &tab[i]
*tab est équivalent à tab[0]
*(tab+i) est équivalent à tab[i]

Examinons cet exemple d'initialisation de tableau qui utilise les deux syntaxes pointeur et tableau :

Exemple 87 : Syntaxe pointeur et tableau pour l’accès aux éléments d’un tableau

Analyse de l'initialisation utilisant la syntaxe de type pointeur *(Tab+i)=10

– Tab représente une constante de type pointeur, on peut l'utiliser comme tout pointeur pour accéder aux éléments du tableau. Mais on ne peut pas modifier ce "pointeur constant" : toute écriture du type Tab ++ est donc interdite.

*(Tab+i)=10 permet d'écrire la valeur 10 dans l'élément pointé par (Tab+i). Le compilateur/linker cherche l'adresse contenue dans Tab, lui ajoute i*sizeof(Tab[0]) et écrit la valeur 10 à l'adresse ainsi obtenue (rappel : sizeof fournit la taille en octets du type ou de la variable qui lui sert d'opérande). L'écriture *(Tab+i) est plus lourde que Tab[i], qui est à utiliser en priorité.


Analyse de l'initialisation utilisant un pointeur for(ptrTab=Tab;…;ptrTab++)*ptrTab=10

ptrTab=Tab permet d'écrire dans le pointeur ptrTab l'adresse du début du tableau Tab. Au début de la boucle, ptrTab pointe l'élément 0 du tableau.

– la valeur de ptrTab n'est pas gardée constante (à la différence de celle du pointeur Tab qui ne peut pas être modifiée) : elle est incrémentée à chaque exécution de la boucle pour permettre à ptrTab de pointer l'élément de tableau suivant. ptrTab pointe donc successivement tous les éléments du tableau.

La seule différence entre tableau et pointeur est qu'un nom de tableau représente une adresse constante (allouée par le compilateur) qui ne peut pas être modifiée (on dit que c'est une constante de type pointeur).

Des instructions comme tab++ ou tab=ptr sont donc interdites si tab est un nom de tableau, alors qu'on peut incrémenter ou affecter une valeur à un pointeur.

L'utilisation de la syntaxe pointeur est souvent utilisée dans le traitement des chaînes de caractères :

Exemple 88 : Utilisation de la syntaxe pointeur pour les chaînes

La boucle while de la fonction copier_chaine est un exemple des écritures condensées que permet le Langage C (ce n'est pas forcément à imiter, car la lisibilité n'en est pas améliorée !). Cette boucle peut s'écrire de façon moins compacte et donc plus lisible pour le débutant :