Você está na página 1de 13

Programacin Orientada a Objetos

Seminario 1
Tipo referencial y gestin de memoria en C++
v 1.1

Objetivos
Conocer la organizacin de memoria de un programa y
comprender la funcin de cada una de sus partes
Conocer y saber utilizar el tipo Puntero en C/C++:
declaracin de variables y manejo de operadores
Comprender el concepto de referencia en C++, su relacin
con el tipo puntero y saber utilizarlas.
Saber utilizar el tipo puntero y las referencias para realizar el
paso de parmetros por variable de tipos simples y tipos
estructurados
Conocer la relacin entre vectores de elementos y el tipo
puntero
Saber reservar y liberar memoria dinmica en C++
2

Uso de la memoria de un programa


La memoria de un ordenador est dividida en casillas o
celdas de igual tamao
Para acceder a una casilla determinada hay que sealar su
direccin, que identifica unvocamente a cada casilla
Cuando se desea ejecutar un programa, el sistema operativo
lo carga en memoria realizando una asignacin de espacio
similar a la siguiente:
Datos estticos

Zona de cdigo
Zona de datos
Montculo (Heap)

Datos
Dinmicos

Memoria sin asignar


Pila (Stack)

Zona de memoria de un programa


Zona de cdigo, donde se almacena el cdigo mquina del
ejecutable
Zona de datos, donde se reserva espacio para almacenar
las variables globales, constantes, etc. Su tamao se define
en tiempo de compilacin
Pila (Stack)
Almacena la informacin de retorno de las funciones, sus
parmetros y sus variables locales
Aumenta o disminuye conforme se van ejecutando o finalizando
las funciones
Su tamao mximo se define en tiempo de compilacin
Se gestiona automticamente

Montculo (Heap o "memoria dinmica")


Memoria que el programador solicita en tiempo de ejecucin
Es gestionada por el programador reservando y liberando
bloques de memoria

Tipo referencial (punteros)


Mecanismo utilizado para el paso de parmetros por
referencia o variable en C/C++ y para referenciar bloques de
memoria en el Heap
Su correcto uso es crtico para una buena programacin
en C/C++
Su uso inadecuado puede ocasionar errores difciles de
detectar
Definicin: Un puntero es una variable que almacena una
direccin de memoria. Normalmente suelen llevar asociados
en su declaracin el tipo de datos al que "apuntan"
Declaracin:
TIPO_apuntado *variable;
Ejemplos:
int *pdato;
Persona *persona;

Uso de punteros
Cuando se declara una variable de tipo puntero tendr un
valor no definido que habr que inicializar
En C++ se utiliza el valor 0 para identificar una direccin de
memoria no inicializada
int *pvalor=0;
El operador & se utiliza para obtener la direccin de memoria
de una variable
int valor=27;
int *pvalor=&valor;

El operador * se utiliza para acceder al dato 'apuntado' por la


direccin de memoria contenida en una variable de tipo
puntero
cout << *pvalor; //Muestra 27
*pvalor = 23;
cout << valor;
//Muestra 23
6

Uso de punteros
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009

27

int valor=27;

1000

int *pvalor=&valor;

Para acceder a los campos de un registro o a los atributos y


miembros de un objeto se puede utilizar el operador ->
main.cpp
class Persona {
public:
string nombre;
string getNombre() const;
};

Persona alumno("Carlos");
Persona *palumno=&alumno;
cout << (*palumno).nombre;
cout << (*palumno).getNombre();
cout << palumno->nombre;
cout << palumno->getNombre();

Paso de parmetros por variable o


referencia
El tipo referencial (puntero) es usado en C/C++ para el paso
de parmetros por variable o referencia
Para modificar el valor de una variable dentro de una funcin
se le pasa su direccin de memoria
void Cuadrado(int *pvalor) {
*pvalor = (*pvalor)*(*pvalor);
}

int valor=3;
Cuadrado(&valor);
cout << valor; //Salida 9

El paso por referencia tambin se utiliza cuando hay que


pasar un objeto "grande" que no se va a modificar (en vez de
pasarlo por copia). En este caso se utiliza el modificador
const para garantizar que no se modifica
void VisualizarPersona (const Persona *p) {
cout << p->getNombre(); //...
}

Referencias en C++
En C++ para simplificar el uso de punteros principalmente en
el paso de parmetros y en la devolucin de valores de
funciones se crearon las referencias
Una referencia se puede considerar como otra forma de
denominar a una variable
Una vez declarada no se puede variar el objeto al que est
asociada
int valor1=27;
int valor2=3;
int &mivalor=valor1;

void Cuadrado (int &n) {


n=n*n;
}

cout << mivalor; //salida 27


mivalor=23;
cout << valor1; //salida 23
mivalor=valor2;
cout << valor1; //salida 3

int valor=3;
Cuadrado(valor);
cout << valor; //salida 9
9

Arrays y punteros
El identificador de un array es realmente un puntero a la
direccin de memoria del primer elemento
int valores[]={32,45,87,23};
int *p,*q;
p=valores; //asignamos el valor 1000
cout<<p[1]; //Salida 45
p[2]=88;
cout << valores[2]; //Salida 88
q=&valores[2];
cout << *q; //Salida 88
cout << q[0]; //Salida 88
cout << q[1]; //Salida 23

1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015

32

valores
1000

45
p
87

1000

23

10

Paso de parmetros de tipo vector


En C++ los vectores, por tanto, siempre pasan por referencia
Se puede utilizar indistintamente la sintaxis de vector como la
de puntero
Se puede utilizar el modificador const cuando se quiera dejar
constancia que no se va a modificar
void Duplicar (int v[ ], int tam) {
for (int i=0; i<tam;i++)
v[i]*=2
}
void Visualiza (const int *v, int tam) {
for (int i=0; i<tam;i++)
cout << v[i] << ' ';
}

int valores[]={1,2,3,4,5};
Duplica(valores,5);
Visualiza(valores,5); //2,4,6,8,10
Duplica(&valores[2],2);
Visualiza(valores,5); //2,4,12,16,10

11

Gestin de memoria dinmica (heap)


Si durante la compilacin no sabemos cuanto espacio
necesitaremos para almacenar datos deberemos hacer uso
de la memoria dinmica en tiempo de ejecucin
Procedimiento: solicitar un bloque de memoria del Heap
que pueda almacenar nuestro/s dato/s y guardar su
direccin de memoria en una variable de tipo puntero
Operador new: reserva un bloque de memoria para
almacenar un valor/es de un tipo de valor y devuelve su
direccin de comienzo
Sintaxis bsica: TIPO *puntero=new TIPO;
Operador delete: libera un bloque de memoria dada su
direccin para que pueda utilizarse en otra parte del
programa
Sintaxis bsica: delete puntero;
12

Gestin de memoria dinmica


int main () {
int *pvalor=0;
*pvalor=25;

//error: memoria no reservada

pvalor=new int; //Reservamos un bloque para almacenar un entero


*pvalor=25;
delete pvalor; //OJO! no olvidar liberar cuando no vaya a utilizarse

Se utiliza new TIPO[NUMELEM] para reservar un bloque de


memoria de NUMELEM elementos de un mismo tipo. Para borrar el
bloque se utiliza delete [] puntero
int main () {
int tam;
int *valores=0;
cout << "Cuntos datos quieres introducir?";
cin >> tam;
valores= new int[tam]; //Reservamos un bloque para tam enteros
//trabajamos con el vector valores de tamao tam
delete [ ] valores;
//liberamos el bloque de memoria

13

Você também pode gostar