Ce n'est pas exact.
NomTableau est bel et bien un tableau de 20 int et non un pointeur. La preuve, c'est que ceci ne compile pas:
1 2
| int NomTableau[20];
int **pp = &NomTableau; |
Alors que ceci compile:
1 2
| int NomTableau[20];
int (*pt)[20] = &NomTableau; |
(Comme tu peux le voir, la syntaxe "pointeur sur tableau" est un peu contre-intuitive: traduit en langage clair, ça donnerait int[20]* pt, mais le compilo n'accepte pas ça).
En fait, NomTableau peut être converti implicitement en pointeur sur le premier élément. Et là où c'est traitre, c'est que c'est fait automatiquement lors de l'appel d'une fonction.
Si tu déclares une fonction ainsi:
void UneFonction(int unTableau[20])
tu te fais avoir, car en réalité le compilateur ignore le 20, voyant ceci:
void UneFonction(int unTableau[])
qu'il considère équivalent à ceci:
void UneFonction(int *unTableau)
Donc en fait, un tableau n'est jamais passé directement par valeur à une fonction: Il y a conversion implicite en pointeur à la place. C'est l'une des choses contre-intuitives du C.
Partager