/*Versión 1:reservar memoria dinámicamente para la matriz, reservando un bloque de tamaño de r(filas)*c(columnas) y acceder a los elementos de la matriz mediante aritmética de punteros*/ #include <stdio.h> #include <stdlib.h> int main() { int r=3,c=4,i,j,count=0; int *arreglo=(int *)malloc(r*c*sizeof(int)); //habría que chequear que fuese el puntero arreglo distinto de NULL for(i=0;i<r;i++) for(j=0;j<c;j++){ //los imprimo como si fuesen vector ya que uso aritmetica de punteros simple *(arreglo+i*c+j)=++count; printf("%d ", *(arreglo+i*c+j));//arreglo=&arreglo[0][0] } //libero el espacio reservado sino lo necesito mas free(arreglo); printf("\n"); getchar(); return 0; } /*Versión 2: solución usando un arreglo de punteros de tamaño r(filas). OJO ESTA SOLUCION ES DINAMICA SOLO A PARTIR DEL ANSI C 99 (1999) EN QUE PERMITE PONER LA DIMENSION DE UN ARRAY CON UNA VARIABLE Y NO HACE FALTA QUE SEA CONSTANTE Luego de crear un arreglo de punteros podemos reservar memoria dinámicamente para las c columnas de cada fila, con respecto a la anterior solucion se sacrifica una pequeña cantidad de espacio extra a cambio de flexibilidad y velocidad*/ #include <stdio.h> #include <stdlib.h> #define r 3 int main() { int c=4,i,j,count=0; int *arreglo[r];//array de 3 punteros a cada fila, cada elemento arreglo[i] es un puntero for(i=0;i<r;i++) //reservo espacio para las columnas de cada fila arreglo[i]=(int *)malloc(c*sizeof(int)); for(i=0;i<r;i++){ for(j=0;j<c;j++){ arreglo[i][j]=++count;//o *(*(arr+i)+j) printf("%d ",arreglo[i][j]); } printf("\n"); } getchar(); return 0; } //Versión 3: creando un array de punteros pero usando puntero a puntero #include <stdio.h> #include <stdlib.h> int main() { int r=3, c=4, i, j, count=0; int **arreglo=(int**) malloc(r*sizeof(int *)); for(i=0;i<r;i++) arreglo[i]=(int*)malloc(c*sizeof(int)); for(i=0;i<r;i++){ for(j=0;j<c;j++){ arreglo[i][j]=++count;//o *(*arreglo+i)+j)=++count; printf("%d ",arreglo[i][j]); } printf("\n"); } /*sino uso más libero espacio de memoria, el orden de liberación es inverso al de asignación dinámica primero libero cada fila y luego el vector de punteros a esas filas*/ for(i=0;i<r;i++) free(arreglo[i]); free(arreglo); getchar(); return 0; } /*Versión 4: creando un array de punteros pero, antes que asignar cada filas de c elementos separadamente es preferible asignar todos los r*c elementos en único bloque de memoria y allí trabajo con una variable auxiliar que sea un puntero al comienzo de cada fila*/ #include <stdio.h> #include <stdlib.h> int main() { int r=3, c=4, i,j,count=0; int *buffer; int **arreglo=(int**) malloc(r*sizeof(int *));//reservo espacio para el vector de punteros buffer=(int*)malloc(r*c*sizeof(int));//los elementos de la matriz //punteros a cada una de las filas for(i=0;i<r;i++){ arreglo[i]=buffer; buffer+=c*sizeof(int);//aritmética de direcciones } for(i=0;i<r;i++) for(j=0;j<c;j++){ //los imprimo como si fuesen vector ya que uso aritmetica de punteros simple *(buffer+i*c+j)=++count; printf("%d ", *(buffer+i*c+j));//arreglo=&arreglo[0][0] } //libero memoria free(*arreglo);//primero los elementos que están en buffer free(arreglo);//segundo libero arreglo de punteros a las filas getchar(); return 0; }