Le tableau est transmis en tant que pointeur vers les éléments.
Si je vous écris:
void doStuff(int *ptr)
{
ptr[1] = 5;
}
int main()
{
int arr[] = {0, 1, 2};
doStuff(arr);
printf("%d %d %d\n", arr[0], arr[1], arr[2]);
}
la sortie sera "0 5 2". C'est parce que C passe tout ce qui est réellement le paramètre en valeur. Le paramètre est un pointeur sur un int. Donc, un pointeur vers un int est passé par valeur. Ainsi, doStuff obtient une copie d'un pointeur vers la mémoire dans le cadre de la pile principale. Quand il déréférence ce pointeur avec ptr[1]
, il suit le pointeur vers la mémoire de main et modifie le tableau là.
C ne peut que passer par la valeur, mais il le fait "peu profond". Si vous lui demandez de passer un int *, il passera un int *. Il copie uniquement la valeur du pointeur, pas les valeurs de tout ce qu'il pointe vers.
Si vous voulez doStuff pour obtenir sa propre copie du tableau, soit envelopper le tableau dans une struct comme d'autres l'ont suggéré, ou utiliser memcpy pour copier en profondeur manuellement le tableau comme ceci:
void doStuff(int *ptr, int nElems)
{
int myCopyOfTheArray[nElems];
memcpy(myCopyOfTheArray, ptr, sizeof(int) * nElems);
/* do stuff with the local copy */
}
Contrairement à l'utilisation une structure, l'approche memcpy fonctionne si nElems n'est connu qu'à l'exécution.
Je crois que ma réponse (détaillée) à cette autre question http://stackoverflow.com/questions/3613302/passing-array-of-struc tures-to-function-c/3613350 # 3613350 couvre également celui-ci. Fondamentalement, c'est une différence entre le tableau et le problème des pointeurs. – kriss
Vous ne pouvez pas utiliser const, si vous ne voulez pas modifier le contenu du tableau? – Nyan