Langage C Pointeurs et tableaux

Historique du langage C

Pointeurs et tableaux

Déclaration avec []
Les toutes premières versions du langage C ne permettaient pas d’utiliser * pour déclarer un pointeur, il fallait utiliser []. Les sources du premier compilateur C montrent cependant qu’une variable déclarée avec [] était un pointeur, déréférençable avec l’opérateur * et incrémentable avec l’opérateur ++ :
/* Exemple des premières versions de C, désormais illégal ! */ int np[]; /* Ceci déclarait en fait un pointeur sur un entier */ /*…*/ *np++ = 1; /* qui était utilisable comme les pointeurs actuels. */
Les premières versions du C n’avaient donc en fait que des pointeurs. La trace la plus visible de cet héritage se retrouve dans la déclaration classique de la fonction main :
int main(int argc, char* argv[]);
Encore aujourd’hui, l’opérateur [] dans un paramètre formel de fonction déclare un pointeur. Cet usage trompeur est inusité, sauf pour main. La déclaration précédente est donc tout à fait équivalente à :
int main(int argc, char** argv);
Il est impossible de déclarer un paramètre formel de type tableau. En revanche, il est possible de déclarer un pointeur sur un tableau. Les déclarations suivantes sont équivalentes, car f reçoit en fait un pointeur de tableau de 13 int :
void f(int tab[2][13]); /* Le 2 est ignoré ! */ void f(int tab[][13]); void f(int (*tab)[13]); /* Usage le plus clair */

Pointeur et premier élément de tableau
Le fait que int t[]; déclarait un pointeur explique les liens très étroits entre pointeurs et tableaux. En effet, si t pointait sur un int et si ce dernier était suivi en mémoire d’autres int, alors t pointait sur le premier élément d’un tableau d’int.
Aujourd’hui int t[]; déclare un tableau de nom t. Mais un nom de tableau est automatiquement utilisé comme un pointeur sur son premier élément dans un contexte ou un pointeur est attendu, c’est-à-dire pour initialiser un pointeur ou comme opérande de +, -, *, [], ==, !=, <, <=, >, >=, !… En revanche, un nom de tableau ne se comporte pas comme un pointeur avec les opérateurs unaires &, ++, –, sizeof ou à gauche de =.
void f(int* q) /* la fonction f prend un pointeur d’entier */ { int *p, t[4]; /* p est un pointeur d’entier, t un tableau de 4 entiers */ p = t; /* assigne &t[0] (adresse du premier élément de t) à p */ *t = 6; /* assigne 6 au premier élément de t */ p[1] = 6; /* assigne 6 au second élément de t */ *(t+2) = 6; /* assigne 6 au troisième élément de t */ t[3] = 6; /* assigne 6 au quatrième élément de t */ f(t); /* initialise q avec &t[0] (adresse du premier élément de t) */

Cours gratuitTélécharger le cours complet

Télécharger aussi :

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *