[gull] Subtilité de C n° 5 : Tableaux et pointeurs, les fossiles

Marc Mongenet marc at mongenet.ch
Wed Apr 30 22:15:29 CEST 2008


Les tableaux et les pointeurs, c'est la mère de toutes les subtilités
de C. :-)

Commençons par le début (des années 1970) :
   http://www.cs.bell-labs.com/who/dmr/primevalC.html
  "Instead, pointer declarations were written in the style int ip[];.
   A fossil from this era survives even in modern C, where the notation
   can be used in declarations of arguments."

En 1972-1973, C avait des pointeurs, mais déclarés avec
l'opérateur [] qu'on utilise aujourd'hui pour déclarer les tableaux.
On peut voir des pointeurs déclarés avec [] dans les sources du
compilateur C de l'époque :
http://www.cs.bell-labs.com/who/dmr/last1120c/c00.c
int np[];
...
*np++ = 1;

Aujourd'hui, on ne peut plus écrire :
void f() {
   int p1[];
   int p2[3];
   *p2++ = 1;
}
car le compilateur réclame une taille pour le tableau p1 et ne
laisse pas incrémenter p2 car ce n'est pas un pointeur.

En revanche, on peut encore écrire le « fossile » :
void f(int p[]) {
   *p++ = 1;
}
car p est un pointeur : "If a parameter is declared to have type
'array of type', the declaration is adjusted to read 'pointer to type'"
(K&R § A 10.1).

C'est un fossile troublant, car il nous laisse donner une taille,
et l'ignore silencieusement :
void f(int p[3]) {
   *p++ = 1;
}

C'est un fossible qu'on rencontre rarement, sauf dans la fonction
main...
#include <stdio.h>
int main(int argc, char *argv[]) {
   printf("hello, world\n");
}
où l'on trouve « char *argv[] » qui est donc lu comme
« char **argv », donc argv est un pointeur et une lvalue.

Attention, une déclaration de tableau n'est lue comme déclarant
un pointeur QUE dans les déclarations de paramètres formels de
fonctions. Ailleurs, les déclarations de tableau et pointeur
déclarent deux types distincts, mais avec des règles de
conversion implicites subtiles, que j'aborderai dans des prochains
messages...

-- 
Marc Mongenet
Creator of the Web 2 Markup Language
http://w2ml.com



More information about the gull mailing list