Tablica jest przekazywana jako wskaźnik do elementów.
Jeśli piszę:
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]);
}
wyjście będzie "0 5 2". Dzieje się tak, ponieważ C przekazuje cokolwiek jest rzeczywiście parametrem według wartości. Parametr jest wskaźnikiem do int. Tak więc wskaźnik do int jest przekazywany przez wartość. W ten sposób doStuff pobiera kopię wskaźnika do pamięci w ramce stosu głównej. Kiedy usuwa zaznaczenie tego wskaźnika za pomocą ptr[1]
, podąża za wskaźnikiem do pamięci głównej i modyfikuje tamtejszą tablicę.
C może przechodzić tylko według wartości, ale robi to "płytko". Jeśli poprosisz, aby przekazał int *, przejdzie on przez int *. Kopiuje tylko wartość wskaźnika, a nie wartości cokolwiek wskazuje.
Jeśli chcesz DoStuff dostać własną kopię tablicy, albo zawinąć tablicy w struct jak inni sugerują, lub używać memcpy ręcznie głęboko skopiować tablicę takiego:
void doStuff(int *ptr, int nElems)
{
int myCopyOfTheArray[nElems];
memcpy(myCopyOfTheArray, ptr, sizeof(int) * nElems);
/* do stuff with the local copy */
}
przeciwieństwie do korzystania struct, memcpy podejście działa, jeśli nElems jest znany tylko w czasie wykonywania.
Wierzę, że moja (szczegółowa) odpowiedź na to inne pytanie http://stackoverflow.com/questions/3613302/passing-array-of-struc tures-to-function-c/3613350 # 3613350 również obejmuje ten. Zasadniczo jest to różnica między problemem macierzy i wskaźników. – kriss
Nie możesz użyć const, jeśli nie chcesz modyfikować zawartości tablicy? – Nyan