jueves, 6 de mayo de 2010

Pasando Arreglos por Referencia en C

Un arreglo puede ser usado como un parámetro a una función, pero como sabemos, el nombre de un arreglo es un algo mas que un puntero. Así suponemos que tenemos una funcion funcionArreglo que recibe un arreglo de int como parámetro.

/* llamada a la función */
funcionArreglo( arregloActual )

/* declaración de la función */
funcionArreglo( int arregloFormal[] )

Primero notamos que la declaración de la función, los corchetes solo sirven como una declaración de tipo, similar a int. De acuerdo con la definición "paso por valor" en C, el valor de arregloActual es copiado al arregloFormal. Pero arregloActual representa una posición de memória, donde todo el arreglo está almacenado, así, arregloFormal[i] accede a arregloActual[i]. Esto significa que las variables representadas por los indices de los arreglos son modificables. Asi un arreglo es pasado por referencia, similar a los punteros.

Segundo, porque no es definido un nuevo arreglo, el compilador no es necesario la especificación del tamaño. Si es proporcionado el tamaño, este es ignorado por el compilador. Es por eso que es casi imposible determinar el número de elementos del arreglo, esto puede ser posible usando el operador sizeof. En algunos casos el tamaño del arreglo es pasado como parámetro adicional. Así, podemos decir que la definición de la función anterior es equivalente a:
/* declaración de la función */
funcionArreglo( int * arregloFormal )

En esta función es mas evidente que el tamaño del arreglo es desconocido.

Tercero, una importante restricción en arreglos, es que los arreglos no pueden ser usados como valores de retorno, esto porque el operador de asignacion "=" no esta definido para arreglos. Asi, int[] no es un tipo de retorno válido.

Las reglas para arreglos y funciones pueden resumirse como sigue:
  • El nombre de un arreglo es mas que un puntero. Los arreglos son pasados por referencia.
  • El número de elementos em un arreglo es indeterminado. Si un número es especificado en la declaración de la función, es ignorado.
  • Un arreglo no puede ser variable de retorno en una función.