Ver Mensaje Individual
  #3 (permalink)  
Antiguo 11/03/2015, 12:36
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: editar matriz desde una funcion en c

Cita:
Iniciado por eferion Ver Mensaje
"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
  1. #include <iostream>
  2.  
  3. void muestra(int c_array[][3])
  4. {
  5.     for (int i=0; i<2; ++i) {
  6.         for (int j=0; j<3; ++j) {
  7.             std::cout << c_array[i][j] << ' ';
  8.         }
  9.         std::cout << '\n';
  10.     }
  11. }
  12.  
  13. template <size_t F, size_t C>
  14. void muestra1(int (*c_array)[F][C]) {
  15. // toma por valor un puntero a array de FxC enteros
  16.     for (int i=0; i<F; ++i) {
  17.         for (int j=0; j<C; ++j) {
  18.             std::cout << (*c_array)[i][j] << ' ';
  19.         }
  20.         std::cout << '\n';
  21.     }
  22. }
  23.  
  24. template <size_t F, size_t C>
  25. void muestra2(int(&c_array)[F][C])
  26. // toma la referencia de un array de FxC enteros
  27. {
  28.     for (int i=0; i<F; ++i) {
  29.         for (int j=0; j<C; ++j) {
  30.             std::cout << c_array[i][j] << ' ';
  31.         }
  32.         std::cout << '\n';
  33.     }
  34. }
  35.  
  36. int main()
  37. {
  38.  
  39.     int arr[2][3] = { {0, 1, 2 }, {3, 4, 5} };
  40.  
  41.     muestra(arr);
  42.     std::cout << '\n';
  43.  
  44.     int(*p)[2][3] = &arr; // puntero al arr de 2x3
  45.     muestra1(p); // p se pasa por valor
  46.     std::cout << '\n';
  47.  
  48.     muestra2(arr); // arr se pasa por referencia
  49.     std::cout << '\n';
  50.  
  51. }