Está en la página 1de 43

Programación Avanzada

por Lic. Luis Pedro López Pérez


Punteros
Puntero

Un puntero es una variable que guarda una dirección de


memoria de otra variable.
Puntero

El tamaño de un puntero va a depender de cosas como el


sistema operativo, la arquitectura del CPU, etc. Lo común es
que si se usa una sistema de 32 bits ocupa 4 bytes de
memoria y si es de 64 bits utiliza 8 bytes.
Operador &

El operador Address-of (&) nos devuelve la dirección de


memoria de la variable que esté como operando en la
expresión.
Operador *

El operador direccionamiento indirecto (indirection)


desreferencia un puntero.
Ejemplo

En el siguiente ejemplo tenemos:


● la dirección de memoria que guarda el puntero
● el valor de la variable a la que apunta el puntero
● la dirección de memoria del puntero
Punteros de punteros

Es recomendable que nuestros punteros tengan el tipo de la


variable a la que va a apuntar, por esta misma idea podemos
tener punteros que van a apuntar a otros punteros.
Memoria dinámica

Va a haber ocasiones en las que no se pueda determinar la


cantidad de memoria que un programa va a necesitar hasta
que se esté en tiempo de ejecución, para estos casos es
necesario que dinámicamente reservemos y liberemos
memoria.
Operador new

Es un operador que localiza y reserva espacio en memoria,


inicializa una variable y regresa un puntero de esa variable.
Operador delete

Libera el espacio en memoria que previamente había sido


reservado por el operador new.
Memoria dinámica

Los operadores new y delete son propios de C++, también es


posible trabajar con memoria dinámica utilizando las
funciones de C malloc(), calloc(), free().
NULL

NULL es una macro que equivale a 0, se usa para inicializar


punteros
nullptr

Es una palabra clave (keyword) que funciona para inicializar


punteros, es menos vulnerable que NULL al uso incorrecto y
funciona mejor en la mayoría de las situaciones
Herramienta para revisar la memoria
Debug -> Windows ->
Memory -> Memory 1
Herramienta para revisar la memoria

● Los valores de la memoria nos aparecerá en hexadecimal


● Los int ocupan 4 bytes en memoria
● 256 al convertirlo en hexadecimal nos da 100
● ¿Entonces porqué nos aparece 00 01 00 00 en lugar de
00 00 01 00? (respuesta en la siguiente diapositiva)
Endianness

Endianness es el término por el que nos referimos al formato


de cómo se almacenarán los datos que ocupen más de un
byte. Existe el big endian y el little endian.
Stack

Cuando declaramos una variable directamente esta se


guarda en el stack, en el stack las direcciones de memoria
están muy cerca unas de otras.
Heap

Cuando declaramos una variable de forma dinámica (new)


ésta se guarda en el heap, pero puede haber mucha
distancia entre una y otra variable, por lo que es más lenta
que el stack, también hay que añadir los pasos extras como
buscar la memoria, reservar y registrar que ya se ocupó así
como la liberación
Material de Estudio

Operador &
https://docs.microsoft.com/en-us/cpp/cpp/address-of-
operator-amp?view=msvc-170
Operador *
https://docs.microsoft.com/en-us/cpp/cpp/indirection-
operator-star?view=msvc-170
Material de Estudio

Operador new
https://docs.microsoft.com/en-us/cpp/cpp/new-operator-
cpp?view=msvc-170
Operador delete
https://docs.microsoft.com/en-us/cpp/cpp/delete-operator-
cpp?view=msvc-170
Material de Estudio

nullptr
https://docs.microsoft.com/en-us/cpp/cpp/nullptr?view=msvc-
170
Endianness
https://es.wikipedia.org/wiki/Endianness

También podría gustarte