Como pasar un array a una función en C++

Para pasar un array a una función:
-         En la función se debe declarar el parámetro como un array del tipo adecuado. En los arrays unidimensionales no es necesario especificar el tamaño  por lo tanto aparecerán los corchetes vacíos.
-         En la llamada a la función a la que se envía el array, el nombre del array aparecerá solo, sin corchetes ni índices
Los arrays en C++ se pasan siempre a las funciones por referencia. El nombre de un array realmente es un puntero que contiene la dirección de memoria donde comienza el array, o lo que es lo mismo, la dirección de memoria del primer elemento. Cuando se pasa un array a una función, la función recibe la dirección de memoria donde se encuentra el primer elemento del array. Por lo tanto, la función trabaja sobre el array original.
No es necesario utilizar el operador & en el paso de arrays a funciones para indicar que se hace por referencia ya que siempre pasan por referencia.
Una función en C++ no puede devolver un array mediante la instrucción return.
Ejemplo 1 de paso de arrays a funciones en C++:
función que recibe un array de dos elementos e intercambia el contenido de estos dos elementos.
#include <iostream>
using namespace std;
void intercambia(int []); //declaración de la función.
                         //No es necesario poner el nombre del array
int main()
{
   int A[2]={3,5};
   intercambia(A); //en la llamada sólo se escribe el nombre
                   //del array, sin corchetes
   cout << A[0] << " " << A[1] << endl; //muestra 5 3
   system("pause");
}
void intercambia(int a[]) //definición de la función
{                            
   int c;                   
   c=a[0];
   a[0]=a[1];
   a[1]=c;
}

Ejemplo 2 de paso de arrays a funciones en C++:
En este ejemplo se leen las estaturas de los alumnos de una clase y se realizan con ellos distintos cálculos.
Se utilizan las siguientes funciones:
Función leer: Lee por teclado las estaturas de los alumnos y las guarda en el array.
Función estatura_media: recibe el array y calcula y devuelve la estatura media.
Función max_min: Calcula y devuelve la estatura mayor y la menor. Recibe el array y los dos parámetros donde devolver la estatura mayor y la menor.
Función cuantos_mayor_menor_media: Calcula y devuelve cuantos alumnos hay con estatura mayor que la media y cuántos con estatura menor. Recibe el array de estaturas, la estatura media y los parámetros donde devolver los resultados.
Función mostrar_resultados: recibe el array y todos los datos calculados y los muestra por pantalla. Solo el array pasa por referencia (por defecto), los demás parámetros pasan por valor.
#include <iostream>
#include <iomanip>
using namespace std;

//declaración de funciones
void leer(double []);
double estatura_media(double []);
void max_min(double [], double &, double &);
void cuantos_mayor_menor_media(double [], double, int &, int &);
void mostrar_resultados(double [], double, double, double, int, int);

int main()
{
   double estaturas[10], media, mayor, menor;
   int cont_mas = 0, cont_menos = 0;
   leer(estaturas);
   max_min(estaturas,mayor,menor);
   media = estatura_media(estaturas);
   cuantos_mayor_menor_media(estaturas,media,cont_mas,cont_menos);
   mostrar_resultados(estaturas,media,mayor,menor,cont_mas,
                      cont_menos);
   system("pause");
}
void leer(double a[])
{
     int i;
     cout << "Lectura de las estaturas de los alumnos:" << endl;
     for(i=0; i<10; i++)
     {
         cout << "Alumno " << i+1 << ": ";
         cin >> a[i];
     }
}
double estatura_media(double a[])
{
     double media = 0;
     int i;
     for(i=0; i<10; i++)
     {
         media = media + a[i];
     }
     media = media / 10;
     return media;
}
void max_min(double a[], double &max, double &min)
{
     int i;
     max = min = a[0];
     for(i=1; i<10; i++)
     {
         if(a[i]>max)
            max = a[i];
         else if(a[i]<min)
                 min = a[i];
     }
}
void cuantos_mayor_menor_media(double a[], double media,
                              int &mayores_media, int &menores_media)
{
     int i;
     for(i=0; i<10; i++)
     {
         if(a[i]>media)
            mayores_media++;
         else if(a[i]<media)
                 menores_media++;
     }
}
void mostrar_resultados(double a[], double media, double mayor,
                  double menor, int mayores_media, int menores_media)
{
     int i;
     system("cls");
     cout << fixed << setprecision(2);
     cout << "Estatura de los alumnos de la clase" << endl;
     cout << "-----------------------------------" << endl;
     for(i=0; i<10; i++)
     {
         cout << "Alumno " << setw(4) << i+1 << ": " << a[i] << endl;
     }
     cout << "Mayor estatura: " << mayor << endl;
     cout << "Menor estatura: " << menor << endl;
     cout << "Estatura media: " << media << endl;
     cout << "Hay " << mayores_media << " alumnos con estatura ";
     cout << "superior a la media" << endl;
     cout << "Hay " << menores_media << " alumnos con estatura ";
     cout << "inferior a la media" << endl << endl;
}

Ejemplo 3: pasar una matriz a una función en C++:
Cuando se pasa una matriz (array bidimensional) a una función, en la función no es necesario especificar el tamaño del primer índice (filas), por lo tanto, aparecerán los corchetes correspondientes vacíos.
En la llamada a la función a la que se envía el array, el nombre del array aparecerá solo, sin corchetes ni índices
Programa que lee por teclado los elementos de dos matrices de enteros y crea otra matriz con la suma de las dos. Se usarán tres funciones.
Función leerMatriz que se usará dos veces para leer por teclado los datos de cada matriz.
Función sumarMatrices que realiza la suma de las dos matrices.
Función mostrarResultado que se usa tres veces para mostrar por pantalla las tres  matrices.
#include <iostream>
#include <iomanip>
using namespace std;

const int MAXFIL = 20;
const int MAXCOL = 30;

//declaración de funciones
void leerMatriz(int [][MAXCOL], int, int);
void sumarMatrices(int [][MAXCOL], int [][MAXCOL],
                  int [][MAXCOL], int, int);
void mostrarResultado(int [][MAXCOL], int, int);

int main ()
{   int nfilas,ncols;
    int matriz1[MAXFIL][MAXCOL];
    int matriz2[MAXFIL][MAXCOL];
    int matriz3[MAXFIL][MAXCOL];

    do
    {
      cout<<"\nIntroduce numero de filas. Maximo " << MAXFIL << ": ";
      cin >> nfilas;
    }while(nfilas<=0 or nfilas >MAXFIL);
 
    do
    {
      cout<<"\nIntroduce numero de columnas. Maximo " <<MAXCOL<<": ";
      cin >> ncols;
    }while(ncols<=0 or ncols >MAXCOL);  

    // Lectura de datos de la primera matriz
    cout << "\n Introduce datos de la primera matriz ";
    leerMatriz(matriz1, nfilas, ncols);

    // Lectura de datos de la segunda matriz
    cout << "\n Introduce datos de la segunda matriz ";
    leerMatriz(matriz2, nfilas, ncols);

    // Calcular la suma de las dos matrices
    sumarMatrices(matriz1, matriz2, matriz3, nfilas, ncols);

    // Mostrar el resultado por pantalla
    system("cls");

    cout << "\nmatriz 1:" << endl;
    mostrarResultado(matriz1, nfilas, ncols);

    cout << "\nmatriz 2:" << endl;
    mostrarResultado(matriz2, nfilas, ncols);

    cout << "\nmatriz 3 = matriz1 + matriz2" << endl;
    mostrarResultado(matriz3, nfilas, ncols);

    system("pause");
}

void leerMatriz(int matriz[][MAXCOL], int nf, int nc)
{
    int fila, col;
    for (fila=0; fila < nf; fila++ )
    {
        cout << "\nFila : " << fila+1 << endl;
        for (col=0; col < nc; col++)
        {
            cout << "Elemento : " << col+1 <<": ";
            cin >> matriz[fila][col];
        }
    }
}
void sumarMatrices(int matriz1[][MAXCOL], int matriz2[][MAXCOL],
                  int matriz3[][MAXCOL], int nf,int nc)
{  
    int fila, col;
    for (fila=0; fila < nf; fila++ )
    {
      for (col=0; col < nc; col++)
        matriz3[fila][col]=matriz1[fila][col] + matriz2[fila][col];
    }
}
void mostrarResultado(int matriz[][MAXCOL], int nf, int nc)
{
    int fila, col;
    for (fila=0; fila < nf; fila++ )
    {
        for (col=0; col < nc; col++)
            cout << setw(4) << matriz[fila][col];
        cout << endl;
    }
}

8 comentarios:

  1. Muy bueno y didácticos tus códigos.. alguien me pregunto si existe la manera de pasar un array por valor. tendras idea? a mi lo unic que se me ocurre es copiar el array a otro y pasar el segundo array.. porque del resto no veo la manera

    ResponderEliminar
    Respuestas
    1. Los arreglos siempre pasan por referencia. Lo que se puede hacer para proteger el contenido, que es lo preocupante en algunos casos, es declarar el mismo como constante. De esta manera la función no podrá modificar el contenido de dicho arreglo.

      Eliminar
  2. Gracias, esta publicación es muy buena me ayudo mucho

    ResponderEliminar
  3. ¿Existe alguna forma de pasar un arreglo bidimensional, sin tener que especificar el tamaño del segundo índice?

    ResponderEliminar
  4. Buenas, si se desea pasar en arreglo de cadenas, de que manera se lo debe realizar?

    ResponderEliminar
  5. De la misma manera q pasas una matriz numérica.

    ResponderEliminar