Material de Estudio Unidad VI
Material de Estudio Unidad VI
Material de Estudio Unidad VI
PUNTEROS
Por Félix Ferreiras
y Zobiesky Ovalle Punteros y Asignación Dinámica de Memoria
Objetivos
Punteros y funciones
Contenido
Punteros y funciones
Variables tipo puntero
&
*
Variables tipo puntero
Las variables tipo puntero o simplemente los punteros
están diseñados para almacenar direcciones de
memoria
Los punteros nos permiten manipular de forma
indirecta la data almacenada en otra variable
Para obtener la dirección de memoria de una
variable utilizamos el operador &
Variables tipo puntero
numero int numero = 3119;
cout << &numero << endl;
3119
int * ptr;
ptr = №
0x2f0a4c8
cout << ptr << endl;
cout << *ptr << endl;
ptr
Declaramos una variable tipo puntero llamada
0x2f0a4c8 ptr la cual almacena la dirección de memoria
de la variable numero. Esto significa que ptr
sabe donde se encuentra el valor 3119 y
puede alterarlo.
Variables tipo puntero
Punteros y funciones
Relación entre punteros y arreglos
*
[]
Relación entre punteros y arreglos
Los nombres de arreglo pueden ser usados como punteros
Los punteros pueden ser usados como nombres de arreglo
Cuando trabajamos con arreglos y utilizamos el operador de
corchetes y un índice para indicar cual elemento del arreglo
será accedido efectivamente estamos haciendo un movimiento
de una posición de memoria a otra la cual puede ser en
secuencia o aleatoria
Los nombres de arreglo no requieren el operador & para
hacer referencia a la dirección de memoria del arreglo. El
nombre del arreglo contiene la dirección de memoria del
primer elemento del arreglo
Relación entre punteros y arreglos
numeros[0] numeros[1] numeros[2] numeros[3] numeros[4]
31 19 14 74 9
En la línea anterior declaramos un arreglo tipo short (2 bytes) de cinco elementos los cuales
ya fueron asignados en la definición del arreglo.
El nombre del arreglo puede ser utilizado perfectamente como un puntero, ahora bien,
surge la siguiente pregunta: Si el nombre del arreglo es un puntero que contiene la
dirección de memoria del primer elemento de éste ¿Cómo puedo acceder a las demás
posiciones utilizando el nombre del arreglo como puntero?
Basta con sumar el valor del índice a la variable puntero antes de utilizar asterisco:
*(numerosPtr + indice) *= 2;
31 19 14 74 9
Se accede a los elementos del arreglo de ambas formas, más adelante veremos otras
operaciones asociadas a punteros.
Contenido
Punteros y funciones
Operaciones con punteros
Aritmética de punteros
Comparaciones entre punteros
Operaciones con punteros
Podemos realizar algunas operaciones aritméticas y
de comparación con punteros
Las operaciones aritméticas que podemos realizar
son de suma o resta, lo que nos permite movernos
hacia delante o atrás con relación a la posición de
memoria a la que apunta el puntero
También podemos realizar operaciones de
comparación con punteros (>, <, <=, >=, ==, !=)
Operaciones con punteros
Sumando al puntero podemos movernos a las
siguientes direcciones de memoria, es decir, más
adelante con respecto a la dirección actual, de
igual manera si restamos podemos movernos
hacia a posiciones anteriores.
punteroA == punteroB
El punteroA y el punteroB son iguales, apuntan a la misma
dirección de memoria, acceden a la misma data
punteroA != punteroB El punteroA y el punteroB tienen direcciones distintas
Operaciones con punteros
En la siguiente imagen podemos ver los valores de cada
dirección de memoria según el elemento o posición en el
arreglo:
31 19 14 74 9
Punteros y funciones
Asignación dinámica de memoria
Arreglos de tamaño fijo en tiempo de ejecución
Memoria física
Es la memoria que se conecta directamente al
procesador y es accesible solo por direcciones físicas;
otros nombres son memoria real, memoria principal,
RAM
Es la cantidad total de memoria RAM instalada en el
computador
La memoria física debe ser organizada por el
sistema operativo de una manera lógica para que el
computador pueda utilizarla
Memoria lógica
Es la forma en que el sistema operativo organiza la memoria
física
La memoria lógica está organizada en forma de particiones
con tamaños máximos y mínimos; cada partición es mapeada
a la memoria física
Típicamente el espacio de direcciones es organizado en:
Memoria convencional
Memoria superior
Memoria extendida
Asignación de memoria por el sistema
operativo
En la ejecución de una aplicación, el sistema
operativo le asigna una cierta cantidad de memoria
para:
Segmento de código
Segmento de datos
Segmento de pila
Libre (Heap)
Asignación de memoria por el sistema
operativo
Sistema Operativo
Pila
Reservado
Asignación de memoria por el sistema
operativo
Sistema Operativo
Reservado
Asignación de memoria por el sistema
operativo
Es memoria lógica reservada por el
sistema operativo
Sistema Operativo
Es constantemente erosionada por el
sistema operativo
Pila
Es usada solo cuando el usuario la necesita
Libre (Heap) No almacena nombres de variables
Es la cantidad disponible después que todo
Datos lo que está siendo ejecutado por el
programa ha obtenido lo que necesita
Programa No tiene por que ser totalmente cargada
(código máquina) en RAM, sino mapeada, pues parte de ella
Reservado puede ser paginada (swap) al disco duro
por el sistema operativo (swapping)
Asignación de memoria por el sistema
operativo
Sistema Operativo
Programa
(código máquina)
Reservado
Asignación dinámica de memoria
Es cuando el programa en ejecución le requiere al
sistema operativo que le asigne un bloque de
memoria libre
La memoria requerida y asignada deberá ser
liberada también en tiempo de ejecución cuando
ya no sea necesario su uso
Puede ser liberada en cualquier orden, sin
importar el orden en que fue asignada, esto
provoca los llamados hoyos en la heap
Asignación dinámica de memoria
Un nuevo requerimiento de memoria dinámica
deberá asignar un bloque completo, sin hoyos, de
direcciones de memoria
Mantenerse al tanto de la memoria asignada y
liberada es complicado, un sistema operativo
moderno realiza todo este trabajo
Variable dinámica
Es una variable puntero cuya dirección es asignada
con el operador new en tiempo de ejecución; la
dirección asignada es tomada de la heap, luego la
variable apuntará a un bloque de memoria libre el
cual será la llamada memoria dinámica
El bloque de memoria dinámica es apuntado por
la variable dinámica con la que gestionará la
información allí almacenada
Variable dinámica
Donde
tipo: es el tipo de dato que manejará la variable dinámica
(direcciones de memoria de tipo), puede ser un tipo
primitivo o uno definido por el programador
variable_puntero: es el nombre de la variable dinámica
tamano: es la cantidad de tipo que es demandada por el
programa al sistema operativo
Operadores new y delete
Para liberar el espacio utilizado por una variable
dinámica:
delete variable_puntero;
delete [] variable_puntero;
Punteros y funciones
Punteros y funciones
Como argumentos
Como tipo de retorno
Punteros como argumentos
Podemos utilizar punteros como argumentos en funciones,
veamos el prototipo de una función que lo incorpore:
tipo * funcion(argumentos);
Punteros como valor de retorno
Esta función se encarga de crear un arreglo
utilizando asignación dinámica de memoria,
con el tamaño especificado en el argumento
size.