Matrices dinámicas

Anuncio
/*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;
}
Descargar