Cita:
Iniciado por eferion "int c[2][2]" es un puntero.
Aunque un array decae en puntero ante la primera oportunidad que se le presente, arrays y punteros son tipos de dato diferentes.
Acá abajo va un ejemplo con llamadas a tres funciones.
La primera es la habitual, donde el array decae en puntero, manejado por abajo por el compilador, perdiendo la información de sus dimensiones.
Las otras pueden hacerse templates, ya que los arrays conservan la informacion de sus dimensiones.
Código C++:
Ver original#include <iostream>
void muestra(int c_array[][3])
{
for (int i=0; i<2; ++i) {
for (int j=0; j<3; ++j) {
std::cout << c_array[i][j] << ' ';
}
std::cout << '\n';
}
}
template <size_t F, size_t C>
void muestra1(int (*c_array)[F][C]) {
// toma por valor un puntero a array de FxC enteros
for (int i=0; i<F; ++i) {
for (int j=0; j<C; ++j) {
std::cout << (*c_array)[i][j] << ' ';
}
std::cout << '\n';
}
}
template <size_t F, size_t C>
void muestra2(int(&c_array)[F][C])
// toma la referencia de un array de FxC enteros
{
for (int i=0; i<F; ++i) {
for (int j=0; j<C; ++j) {
std::cout << c_array[i][j] << ' ';
}
std::cout << '\n';
}
}
int main()
{
int arr[2][3] = { {0, 1, 2 }, {3, 4, 5} };
muestra(arr);
std::cout << '\n';
int(*p)[2][3] = &arr; // puntero al arr de 2x3
muestra1(p); // p se pasa por valor
std::cout << '\n';
muestra2(arr); // arr se pasa por referencia
std::cout << '\n';
}