Funciones a las que se pasan arrays

Supongamos que queremos pasar un array a una función. La solución es pasar punteros. El nombre de un array es un puntero al primer elemento del array. Así, si hemos definido int taco[10] como un array de diez enteros, taco será un puntero al array. Por ejemplo, sea guacamole un array de 6 enteros: 6, 63, 112, 18, -52, 16. guacamole es simplemente un puntero al primer elemento. Entonces, *guacamole equivale al valor 6. Si tratamos de acceder al elemento guacamole[6], estamos accediendo a lo que haya después del último elemento del array. Los resultados son inesperados.
Veamos un ejemplo de cómo pasar un array a una función:
# include <iostream.h>

void eat_at_joes(int guacamole[])
{
  guacamole[0] = 1;
  guacamole[1] = 2;
  guacamole[2] = 3;
}

main()
{
  int taco[3];
  int nacho[2];

  eat_at_joes(taco);
  eat_at_joes(nacho);
}

Al definir la función, no hemos puesto ningún número entre los corchetes. Esto significa que estamos permitiendo que un array de cualquier tamaño pueda ser pasado a la función. En la función main, hemos declarado dos arrays de enteros, taco y nacho. Primero pasamos taco a la función, que en realidad es la direccion del array taco. Ahora bien, el segundo array, nacho, tiene sólo dos elementos. Cuando la función trate de acceder al tercer elemento del array, que realmente no existe. Ya que los arrays son muchas variables almacenadas una detrás de otra en la memoria del ordenador, tratará y accederá a la variable almacenada despueés del segundo elemento del array, que no existe.
Además, el programa compilará y correrá sin mensajes de error. Esto sucedía ya en C, que permite leer y escribir en la memoria del ordenador sin saber si realmente hay variables allí. Se deben evitar casos como el del ejemplo, porque, o bien el programa correrá sin mensajes de error, o bien casca.
Una forma de evitarlo es añadiendo un segundo parámetro que indique el tamaño del array:
# include <iostream.h>

void eat_at_joes(int guacamole[], int size)
{
  if (size > 0)
    guacamole[0] = 1;
  if (size > 1)
    guacamole[1] = 2;
  if (size > 2)
    guacamole[2] = 3;
}

main()
{
  int taco[3];
  int nacho[2];

  eat_at_joes(taco,3);
  eat_at_joes(nacho,2);
}

Free Web Hosting