Вы находитесь на странице: 1из 29

Introduccin a la Programacin

Semana 14:
Memoria Dinmica 2

Noviembre de 2015
1

Agenda

Reserva esttica versus dinmica

Vector de apuntadores

Arreglos bidimensionales: matrices

Matrices dinmicas

Apuntador a Apuntador

Operaciones con matrices


2

Reserva Esttica versus Dinmica


Reserva esttica del vector:
Es necesario saber a priori la dimensin mxima del vector.
La variable que representa el vector almacena la direccin
ocupada por el primer elemento del vector.

El vector declarado dentro del cuerpo de una funcin no


puede ser usado fuera del cuerpo de la funcin.

#define TAM 10
int v[TAM];
3

Reserva Esttica versus Dinmica


Reserva dinmica del vector:
La dimensin del arreglo puede ser definida en tiempo de
ejecucin.
La variable del tipo apuntador recibe el valor de la direccin
del primer elemento del vector.
El rea de memoria ocupada por el vector permanece vlida
hasta que sea explcitamente liberada (a travs de la funcin
free)
El arreglo reservado dentro del cuerpo de una funcin puede
ser usado fuera del cuerpo de la funcin, mientras la memoria
est reservada.
int *v;
4

v = (int *) malloc(n * sizeof(int));

Reserva Esttica versus Dinmica


Funcin realloc:
Permite reasignar memoria a un arreglo
preservando el contenido de los elementos, que
permanecen vlidos despus de la reasignacin.
Ejemplo:
m representa la nueva dimensin del array.
v = (int*) realloc(v, m*sizeof(int));
5

Vector de Apuntadores
En este caso, los elementos del array son del tipo apuntador.

Ejemplo 1
int* vect[10];
int i=1;
vect[5]= &i; // la componente vect[ k ] es un apuntador
*vect[5] = 2; // tambin la variable i valdr 2.

Vector de Apuntadores
Ejemplo 2
char* colores[4] = {"Gris", "Azul", "Rojo", "Verde"};
// Array bidimensional (4 apuntadores a carcter)
*colores[2] = "Anaranjado";

float* a[10];
float x=10.5f;
a[6] = &x;
*a[6] = 0; // cunto vale x?
7

Arrays bidimensionales: matrices


Array bidimensional: matriz

Arrays bidimensionales: matrices


Array bidimensional (o matriz):
declarado estticamente.
los elementos son accesados con doble ndice m[ i ][ j ]

i se refiere a la fila y j se refiere a la columna.


Los ndices comienzan en cero:
m[0][0] representa al elemento de la primera fila y primera
columna.
variable representa un apuntador hacia el primer vector-fila

La matriz tambin puede ser inicializada en la declaracin.

Arrays bidimensionales: matrices


Paso de matrices como argumentos de funciones:
declaracin de la matriz en la funcin principal:

float mat[4][3];

prototipo de la funcin (opcin 1): parmetro declarado como


vector-fila
void f (..., float (*mat)[3], ...);

prototipo de la funcin (opcin 2): parmetro declarado como


matrz, omitiendo el nmero de filas
void f (..., float mat[ ][3], ...);

10

Matrices Dinmicas
Reserva esttica del array:

Es necesario saber a priori sus dimensiones.


Reserva dinmica del array:

C slo permite reserva dinmica de conjuntos


unidimensionales.
Es necesario crear abstracciones conceptuales
con vectores para representar matrices
(reservadas dinmicamente).
11

Matriz Dinmica usando vector simple


Matriz representada por un vector simple:

conjunto bidimensional representado en un vector


unidimensional
estrategia:
Las primeras posiciones del vector almacenan
elementos de la primera fila.

seguidos de los elementos de la segunda fila, y as


sucesivamente
exige cuidado para accesar a los elementos de la
12
matriz.

Matriz Dinmica usando vector simple


Matriz representada por un vector simple:
matriz mat con n columnas representada en el vector v:

mat[ i ][ j ] mapeado en v[ k ] donde k = i * n + j

13

Matriz Dinmica usando vector simple


Matriz representada por un vector simple:
mat[ i ][ j ] es mapeada en v[ i * n + j ]

float *mat; /* matriz m x n representada por un vector */


...
mat = (float *) malloc(m*n*sizeof(float));

14

Apuntador a Apuntador
Una variable apuntador est reservada en la
memoria del computador como cualquier otra
variable.

Por tanto podemos crear un apuntador que


contiene la direccin de memoria de otro
apuntador.
Sintaxis para crear un apuntador a apuntador:
tipo **nombreApuntador;
15

Apuntador a Apuntador
Ejemplo:
int main(){
int a=5, *b, **c;
b = &a;
c = &b;
printf("%d\n", a);
printf("%d\n", *b);
printf("%d\n", *(*c));
}
16

Apuntador a Apuntador
Explicacin:

El programa imprime 5 tres veces, mostrando las


tres formas de acceso a la variable a: a, *b, **c.

17

Apuntador a Apuntador
De lo que vimos en la sesin anterior, sabemos
que un apuntador puede ser usado para
referenciar a un vector reservado dinmicamente.
int *p;
p = calloc(5, sizeof(int));

18

Apuntador a Apuntador
Lo mismo sucede con un apuntador a apuntador,
slo que en este caso el vector reservado es de
apuntadores.
int **p;
p = calloc(5, sizeof(int *));.

Observe que cada posicin del vector anterior es del tipo int *, 19
es decir, un apuntador a entero!

Matrices Dinmicas
Matriz representada por un vector de apuntadores:

cada elemento del vector almacena la direccin del


primer elemento de cada fila de la matriz.

20

Pasos para crear una matriz dinmica


Esta es la forma de crear matrices dinmicamente:

1. Crear un apuntador a apuntador.


2. Asocie un vector de apuntadores reservado dinmicamente
con este apuntador a apuntador.
3. El tamao de este vector es el nmero de filas de la matriz.
4. Cada posicin del vector ser asociado con otro vector del
tipo a ser almacenado. Cada uno de estos vectores es una fila
de la matriz (por tanto posee tamao igual al nmero de
columnas).

OBS: Al final se debe liberar toda la memoria reservada!


21

Ejemplo Matriz dinmica


Como cada posicin del vector es un apuntador a
entero, podemos asociar cada posicin
dinmicamente con un vector de enteros!

int **p;
int i;
p = calloc(5, sizeof(int *));
for(i=0; i<5; i++)
p[i] = calloc(3, sizeof(int));
22

Ejemplo Matriz dinmica


Como cada posicin del vector es un apuntador a entero,
podemos asociar cada posicin dinmicamente con un
vector de enteros!
int **p;
int i;

p = calloc(5, sizeof(int *));


for(i=0; i<5; i++)

p[i] = calloc(3, sizeof(int));


23

Operaciones con Matrices


Ejemplo: funcin transpuesta:

entrada: mat matriz de dimensin m x n


salida: trp transpuesta de mat, reservada
dinmicamente.
Q es la matriz transpuesta de M si y solamente
si Q[ i ][ j ] = M [ j ][ i ]
Solucin 1: matriz reservada como vector
simple
Solucin 2: matriz reservada como vector de
apuntadores
24

Matrices Dinmicas
/* Solucin 1: reserva de matriz como vector simple */
float *transpuesta (int m, int n, float* mat)
{
int i, j;
float* trp;
/* reserva la matriz transpuesta con n filas y m columnas */
trp = (float*) malloc(n*m*sizeof(float));
/* rellena la matriz */
for (i=0; i<m; i++)
for (j=0; j<n; j++)
trp[ j*m+i ] = mat[ i*n+j ];
return trp;
}

25

Matrices Dinmicas
/* Solucin 2: reserva de matriz como vector de apuntadores */
float** transpuesta (int m, int n, float** mat)
{
int i, j;
float** trp;
/* reserva matriz transpuesta con n filas y m columnas */
trp = (float**) malloc(n*sizeof(float*));
for (i=0; i<n; i++)
trp[i] = (float*) malloc(m*sizeof(float));
/* rellena matriz */
for (i=0; i<m; i++)
for (j=0; j<n; j++)
trp[ j ] [ i ] = mat[ i ][ j ];
return trp;
26
}

Funcin main() 1/3


Declaracin de prototipos
#include <stdio.h>
#include <stdlib.h>
void MostrarMatriz(int m,int n,float **p);
float** transpuesta (int m, int n, float** mat);
int main(){
float **p,**q;
int i, j;
p = calloc(5, sizeof(float *));
for(i=0; i<5; i++)
p[i] = calloc(3, sizeof(float));
27

Funcin main() 2/3


Entrada y salida de coeficientes de la matriz. Llamada a transpuesta.
printf("Ingrese los coeficientes de la matriz\n");
for(i = 0; i<5; i++){
printf("Fila %d: ",i+1);
for(j=0; j<3; j++)
scanf("%f", &p[i][j]);
}
printf("Matriz ingresada\n");
MostrarMatriz(5,3,p);
q=transpuesta(5,3,p);
printf("Matriz transpuesta\n");
MostrarMatriz(3,5,q);
28

Funcin main() 3/3


Liberando la memoria reservada.

//liberando memoria usada


for(i=0; i<5; i++)
free(p[i]);
free(p);
for(i=0; i<3; i++)
free(q[i]);
free(q);
}
29

Вам также может понравиться