L'array viene passato come puntatore agli elementi.
se scrivo:
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]);
}
l'uscita sarà "0 5 2". Questo perché C passa qualunque cosa sia effettivamente il parametro in base al valore. Il parametro è un puntatore a un int. Quindi un puntatore a un int è passato per valore. Pertanto, doStuff ottiene una copia di un puntatore sulla memoria nel frame dello stack principale. Quando si dereferenzia quel puntatore a ptr[1]
, segue il puntatore alla memoria principale e modifica l'array lì.
C può passare solo per valore, ma lo fa "superficialmente". Se gli chiedi di passare un * int, passerà un * int. Copia solo il valore del puntatore, non i valori di qualsiasi cosa a cui punta.
Se si desidera doStuff per ottenere la propria copia della matrice, sia avvolgere la matrice in una struttura come altri hanno suggerito, o utilizzare memcpy per copiare manualmente in profondità l'array come questo:
void doStuff(int *ptr, int nElems)
{
int myCopyOfTheArray[nElems];
memcpy(myCopyOfTheArray, ptr, sizeof(int) * nElems);
/* do stuff with the local copy */
}
A differenza di una struct, l'approccio memcpy funziona se nElems è conosciuto solo al runtime.
Credo la mia risposta (dettagliata) a questa altra domanda http://stackoverflow.com/questions/3613302/passing-array-of-struc tures-to-function-c/3613350 # 3613350 copre anche questo. Fondamentalmente questa è una differenza tra il problema dell'array e dei puntatori. – kriss
Non puoi usare const se non vuoi modificare il contenuto dell'array? – Nyan