int t[10];
on déclare un tableau, et le compilateur réserve une zone de 10 entiers
consécutifs.
Quand on déclare int *p
, il s'agit toujours d'un pointeur, et le
compilateur réserve simplement un élément de mémoire pouvant contenir un
pointeur.
Les caractéristiques du langage C qui créent la confusion dans l'esprit des utilisateurs, sont les trois règles suivantes :
T[i]
est équivalent à *(T + i)
.
void fonc (int t[]) { ... }
est équivalent à void fonc (int * t) { ... }
.
Les types des objets déclarés de type tableau ou de type pointeur
sont différents dans tous les autres
contextes, que ce soit déclaration de variables globales ou locales à une
fonction.
int t[10]
qui n'est pas un paramètre formel, déclare un tableau de 10 entiers.
Ce sont les utilisations ultérieures de t qui subissent une conversion
en type pointeur vers entier.
Par contre, à la déclaration d'un paramètre formel int t[]
,
c'est la déclaration elle-même qui est transformée en int *t
.
char t[] = "Hello";
et char *p = "Hello";
.
Dans le premier cas, le compilateur alloue un tableau de 6 caractères qu'il
initialise avec les caractères H, e, l, l, o et \0
.
Toute occurrence de t dans une expression sera convertie en type
pointeur vers char.
Dans le second cas, le compilateur alloue un tableau de 6 caractères qu'il
initialise de la même manière que dans le premier cas, mais de surcroît,
il alloue une variable de type pointeur vers char qu'il initialise
avec l'adresse du premier caractère de la chaîne.
char t[] = "Hello"; |
|
char *p = "Hello"; |
|
Ceci est un cas particulier des tableaux de caractères qui ne se reproduit pas
avec les autres types.
On peut déclarer un tableau d'entiers par int t[] = {1, 2, 3, 4, 5};
,
mais on ne peut pas déclarer un pointeur vers un tableau d'entiers par :
int *p = {1, 2, 3, 4, 5};
.