¿Cómo pasar una array 2D como parámetro en C?

Esta publicación es una extensión de ¿Cómo asignar dinámicamente una array 2D en C?  
Una array unidimensional se puede pasar fácilmente como un puntero, pero la sintaxis para pasar una array 2D a una función puede ser difícil de recordar. Una cosa importante para pasar arreglos multidimensionales es que no es necesario especificar la primera dimensión del arreglo. La segunda dimensión (y cualquier subsiguiente) debe darse
1) Cuando ambas dimensiones están disponibles globalmente (ya sea como una macro o como una constante global). 
 

C

#include <stdio.h>
const int M = 3;
const int N = 3;
 
void print(int arr[M][N])
{
    int i, j;
    for (i = 0; i < M; i++)
      for (j = 0; j < N; j++)
        printf("%d ", arr[i][j]);
}
 
int main()
{
    int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    print(arr);
    return 0;
}
Producción

1 2 3 4 5 6 7 8 9 

2) Cuando solo la segunda dimensión está disponible globalmente (ya sea como una macro o como una constante global). 
 

C

#include <stdio.h>
const int N = 3;
 
void print(int arr[][N], int m)
{
    int i, j;
    for (i = 0; i < m; i++)
      for (j = 0; j < N; j++)
        printf("%d ", arr[i][j]);
}
 
int main()
{
    int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    print(arr, 3);
    return 0;
}
Producción

1 2 3 4 5 6 7 8 9 

El método anterior está bien si la segunda dimensión es fija y no está especificada por el usuario. Los siguientes métodos manejan casos en los que la segunda dimensión también puede cambiar.
3) Si el compilador es compatible con C99 
Desde C99, el lenguaje C admite arrays de tamaño variable para pasar simplemente especificando las dimensiones variables (consulte esto para ver un ejemplo de ejecución) 
 

C

// The following program works only if your compiler is C99 compatible.
#include <stdio.h>
 
// n must be passed before the 2D array
void print(int m, int n, int arr[][n])
{
    int i, j;
    for (i = 0; i < m; i++)
      for (j = 0; j < n; j++)
        printf("%d ", arr[i][j]);
}
 
int main()
{
    int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    int m = 3, n = 3;
    print(m, n, arr);
    return 0;
}
Producción

1 2 3 4 5 6 7 8 9 

Si el compilador no es compatible con C99, entonces podemos usar uno de los siguientes métodos para pasar una array 2D de tamaño variable.
4) Usando un solo puntero 
En este método, debemos encasillar la array 2D al pasar a la función. 
 

C

#include <stdio.h>
void print(int *arr, int m, int n)
{
    int i, j;
    for (i = 0; i < m; i++)
      for (j = 0; j < n; j++)
        printf("%d ", *((arr+i*n) + j));
}
 
int main()
{
    int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    int m = 3, n = 3;
 
    // We can also use "print(&arr[0][0], m, n);"
    print((int *)arr, m, n);
    return 0;
}
Producción

1 2 3 4 5 6 7 8 9 

5) Usando el concepto de puntero a una array

C

#include <stdio.h>
const int M = 3;
 
 
void print(int (*arr)[M])
{
    int i, j;
    for (i = 0; i < M; i++)
    for (j = 0; j < M; j++)
        printf("%d ", arr[i][j]);
}
 
int main()
{
    int arr[][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};
    print(arr);
    return 0;
}
Producción

1 2 3 4 5 6 7 8 9 

Referencias:  
http://www.eskimo.com/~scs/cclass/int/sx9a.html
Este artículo es una contribución de Abhay Rathi . Escriba comentarios si encuentra algo incorrecto o si desea compartir más información sobre el tema tratado anteriormente.
 

Publicación traducida automáticamente

Artículo escrito por GeeksforGeeks-1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *