La matriz se pasa como un puntero a los elementos.
si escribo:
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 salida será "0 5 2". Eso es porque C pasa lo que sea realmente el parámetro por valor. El parámetro es un puntero a un int. Entonces un puntero a un int se pasa por valor. Por lo tanto, doStuff obtiene una copia de un puntero a la memoria en el marco de la pila principal. Cuando desreferencia ese puntero con ptr[1]
, está siguiendo el puntero a la memoria principal y modificando la matriz allí.
C solo puede pasar por valor, pero lo hace "superficialmente". Si le pides que pase un int *, pasará un int *. Solo copia el valor del puntero, no los valores de nada a lo que apunta.
Si desea hacerTarea para obtener su propia copia de la matriz, o bien envolver la matriz en una estructura como otros han sugerido, o utilizar memcpy para copiar manualmente la profundidad de la matriz de la siguiente manera:
void doStuff(int *ptr, int nElems)
{
int myCopyOfTheArray[nElems];
memcpy(myCopyOfTheArray, ptr, sizeof(int) * nElems);
/* do stuff with the local copy */
}
A diferencia del uso una estructura, el enfoque memcpy funciona si nElems solo se conoce en tiempo de ejecución.
Creo que mi respuesta (detallada) a esta otra pregunta http://stackoverflow.com/questions/3613302/passing-array-of-struc tures-to-function-c/3613350 # 3613350 también cubre este. Básicamente, esa es una diferencia entre la matriz y el problema de los indicadores. – kriss
¿No puedes usar const, si no quieres modificar el contenido de la matriz? – Nyan