Ver Mensaje Individual
  #4 (permalink)  
Antiguo 12/03/2015, 22:49
ecfisa
 
Fecha de Ingreso: julio-2012
Mensajes: 133
Antigüedad: 12 años, 4 meses
Puntos: 22
Respuesta: editar matriz desde una funcion en c

Hola Ic4r0.

De modo general, un arreglo no es un apuntador. El segundo es una variable a la que se le puede asignar valores, incrementar, etc., mientras que el primero no.

Vg., es correcto:
Código C:
Ver original
  1. {
  2.   int *ip, v[5]={0,1,2,3,4};
  3.  
  4.   ip = v;  // ip -> v[0]
  5.   ip++;    // ip -> v[1]
  6.   (*ip)++; // v[1] = 2
Pero no es así a la inversa:
Código C:
Ver original
  1. {
  2.   int *ip, v[5]= {0,1,2,3,4};
  3.  
  4.   v = p     // error
  5.   v++;      // error
  6.   ...
Sin embargo, cuando se envía un nombre de arreglo como parámetro, se está enviando la posición del primer elemento del mismo y dentro de la función es una variable local. Es decir que en este caso sí se trata de un apuntador.

Un ejemplo muy simple con tres formas de declarar el parámetro y modificar los valores de la matriz enviada como argumento en C:
Código C:
Ver original
  1. #include <stdio.h>
  2.  
  3. // 1) como un arreglo de arreglos de 3 enteros
  4. void init1(int [][3], int);
  5. // 2) como un puntero a un arreglo de tres enteros
  6. void init2(int (*)[3], int);
  7. // 3) como un puntero al primer elemento del argumento
  8. void init3(int *, int , int );
  9.  
  10. void showMat(int [][3], int);
  11.  
  12. int main() {
  13.   int m1[3][3] ,m2[3][3], m3[3][3];
  14.  
  15.   init1(m1, 3);
  16.   init2(m2, 3);
  17.   init3(m3, 3, 3);
  18.   showMat(m1, 3);
  19.   showMat(m2, 3);
  20.   showMat(m3, 3);
  21.  
  22.   return 0;
  23. }
  24.  
  25. // 1)
  26. void init1(int mt[][3], int rows) {
  27.   int c, r;
  28.   for(r=0; r<rows; r++)
  29.     for(c=0; c<3; c++)
  30.       mt[r][c] = 1;
  31. }
  32. // 2)
  33. void init2(int (*mt)[3], int rows) {
  34.   int c, r;
  35.   for(r=0; r<rows; r++)
  36.     for(c=0; c<3; c++)  
  37.       mt[r][c] = 2;
  38. }
  39. // 3)
  40. void init3(int* mt, int cols, int rows) {
  41.   int c, r;
  42.   for(r=0; r<rows; r++)
  43.     for(c=0; c<cols; c++)  
  44.       mt[r*cols+c] = 3;
  45. }
  46.  
  47. void showMat(int mt[][3], int rows) {
  48.   int c, r;
  49.   for(r=0; r<rows; r++) {
  50.     for(c=0; c<3; c++) printf("%3d", mt[r][c]);
  51.     printf("\n");
  52.   }
  53.   printf("-------------------\n");
  54. }

Saludos.