Está en la página 1de 37

PUNTEROS - I

Diego Alonso Cueva Chamorro


Memoria
• Para un programa, la memoria de la computadora es como una sucesión de
espacios de memoria, cada cual de un byte de tamaño y cada uno con una dirección
única. Estas celdas están ordenadas de tal manera que representaciones de datos
que requieran más de un espacio, ocupen espacios contiguos.

• De esta manera, cada celda puede ser ubicada fácilmente en la memoria por medio
de su dirección única. Por ejemplo, la celda de memoria con dirección 1776 siempre
está a continuación de la 1776 y antes de la 1777, y está exactamente a 1000
posiciones después de la 776 y 1000 posiciones antes de la 2776.

• Cuando se declara una variable, la memoria necesita almacenar su valor en una


ubicación específica (memory address). Generalmente, los programas no deciden la
ubicación exacta donde se almacenarán la variables. Por fortuna, el entorno donde
se ejecuta el programa se encarga de esto. Sin embargo, puede ser útil para un
programa obtener la dirección en memoria de una determinada variable durante su
ejecución.
Punteros
• Toda variable se encuentra en la memoria del computador y tiene una dirección
definida.

• Un puntero es una variable que tiene como valor la dirección de otra variable.
Punteros

• Un puntero es un objeto de lenguaje de programación, cuyo valor referencia a otro


valor almacenado en otra parte de la memoria del computador, utilizando su
dirección. Un puntero referencia a una dirección en memoria, obtener el valor alojado
en dicha dirección es conocido como desreferencia. Como una analogía, el número
de página en el índice de un libro puede ser considerado un puntero a la página
correspondiente; la desreferencia sería avanzar las páginas hasta la página con el
número indicado.

• Muchas veces es mucho más barato en tiempo y espacio copiar y des referenciar
punteros que copiar y acceder a los datos a los cuales apunta el puntero.
Punteros
• Por lo general, una variable contiene un valor específico, un entero, un flotante, un
carácter, etc. En cambio, una variable puntero contiene la dirección en memoria de
una variable que contiene un valor específico.
• De esta manera, mediante el nombre o el identificador de una variable, hacemos
referencia directa a un valor. En cambio, mediante el nombre o identificador de un
puntero, hacemos referencia indirecta a un valor. Al proceso de referenciar a un valor
a través de un puntero, se le llama indirección.
Punteros

• Si tenemos una dirección de memoria, el sistema provee algún operador para


obtener el valor almacenado en dicha ubicación (usualmente utilizando los registros
de propósito general)
Punteros
Usos

• Paso de valores entre diferentes partes de un programa (paso de parámetros por


referencia). Esto es útil cuando se quiere permitir a una función modificar los valores
del parámetro enviado.

• Crear y manipular estructuras de datos dinámicas, que pueden crecer y encogerse


en tiempos de ejecución, como las pilas, árboles y listas.

• Los punteros también se puede utilizar para asignar y desasignar en la memoria


variables dinámicas y matrices. Ya que muchas veces una variable puede volverse
redundante después de que haya cumplido su objetivo, que resulta en una pérdida
de la memoria mantenerla, en consecuencia es una buena práctica para
desasignarla cuando ya no se necesita, utilizando la referencia de puntero original.
Segmentation fault

• Usualmente, un puntero es lo suficientemente grande para almacenar más


direcciones de las que tiene la memoria del sistema. Esto crea la posibilidad de que
un programa intente acceder a un espacio de memoria que no existe, ya sea porque
no hay suficiente memoria instalada o que la arquitectura no permite soportar estas
direcciones.
Descripción formal

• Un dato primitivo es un dato que se puede leer o escribir en la memoria del


computador con un solo acceso (como byte o word)

• Un dato agregado es un grupo de primitivos que están lógicamente contiguos en la


memoria y son vistos colectivamente como un solo dato. Cuando uno de estos datos
está conformado por el mismo tipo de primitivos es llamado un arreglo o array.

• Un byte es el primitivo más pequeño, cada dirección de memoria apunta a un byte


diferente. La dirección de memoria del primer byte de dato es considerada como la
dirección de memoria de todo el dato.
Descripción formal
Declarando punteros
• Debido a que un puntero apunta directamente al valor al que apunta, el puntero tiene
propiedades diferentes cuando apunta a un char que cuando apunta a un int. Es por
esto que un puntero debe indicar el tipo de dato al que apunta.

• La declaración de un puntero tiene la siguiente sintaxis:

• Ejemplo:
Declarando punteros
• Aunque los punteros apunten a tipos de datos diferentes, todos los punteros ocupan
el mismo espacio en la memoria del computador (depende de la plataforma donde se
corre el programa). Sin embargo, el tipo de dato al que apuntan no ocupan el mismo
tamaño necesariamente.
Operadores con punteros
Operador de dirección o de referencia

• El operador &, aplicado sobre el nombre de una variable, devuelve su dirección de


memoria.
• Este operador puede ser leído como “dirección de”.
Operador de dirección o de referencia
Operador de indirección o de dereferencia

• El operador *, aplicado sobre una variable de tipo puntero permite acceder al dato al
que apunta, es decir, al valor de la variable situada en esa dirección de memoria.
• Este operador puede ser leído como “valor referenciado por”.
Operador de indirección o de dereferencia
Inicialización de punteros
• Los punteros pueden ser inicializados para que referencien a una ubicación
específica en el mismo momento que son definidos.
• Cuando un puntero es inicializad, lo que se inicializa es la dirección a la que apunta,
no el valor de la posición a la que se apunta,
Ejemplo
Ejemplos
Ejemplos
Parámetros por referencia y por valor

• En la mayoría de los lenguajes hay dos formas de pasar las variables a una función,
por valor o por referencia:

 Por valor significa que la función (o subrutina) recibe sólo una copia del valor
que tiene la variable, o sea que no la puede modificar.

 Por referencia significa que se pasa la posición de memoria donde esta


guardada la variable, por lo que la función puede saber cuánto vale, pero
además puede modificarla de cualquier manera.
Paso de punteros por valor
• Al enviar parámetros por valor se hace una copia del parámetro enviado.
• El valor original no será modificado.
Paso de punteros como parámetro
• Los punteros se pueden enviar como parámetro a una función.
• También llamado paso de parámetros por dirección.
Paso de parámetros por referencia
• Podemos hacer una pequeña modificación al código anterior para hacer el paso de
parámetros por referencia.
• Es rápido porque no hay que crear copias de los valores. Además permite a la
función modificar el parámetro.
Paso de parámetros por referencia
• El envío de parámetros por referencia abre la posibilidad de que una función
devuelva más de un valor.
• Los parámetros utilizados para recuperar datos de una función son llamados
parámetros de salida.
Punteros tipados
• En varios lenguajes, los punteros tienen la restricción adicional de que el objeto al
que apunten sea de un tipo especificado. Por ejemplo, un puntero puede ser
declarado para apuntar a enteros, el lenguaje entonces intentará prevenir que se
apunte a objetos que no sean enteros.
Puntero a un tipo incorrecto
• El tipo base del puntero determina el tipo de datos al que apunta el puntero y por
tanto es el que indica al compilador cuántos bytes debe transferir para cualquier
asignación que usa un puntero. Como podemos asignar cualquier dirección a un
puntero, no se produce error cuando asignamos a un puntero, la dirección de una
variable de un tipo distinto.
Puntero no inicializado
• Lo peor en este caso es que el compilador no muestra ningún mensaje de error o de
aviso.
Puntero usado incorrectamente
• Suele ocurrir cuando se olvida poner el operador de dirección &.
Punteros seguros
• Un puntero que no tiene una dirección asignada es llamado wild pointer. Cualquier
intento de usar un puntero no inicializado puede causar un comportamiento
inesperado, ya sea porque el valor inicial no es una dirección válida, o porque usarlo
puede dañar otras partes del programa.

• En sistemas que permiten asignación explícita de memoria, es posible crear un


Dangling pointer (referencia colgante). Este tipo de puntero es peligroso porque una
región de memoria desasignada puede contener los mismos datos que tenía antes
de ser asignada, y al ser reasignada sobreescribir código anterior. Los lenguajes con
recolectores de basura previenen este tipo de error porque la desasignación se
realiza automáticamente cuando ya no hay más referencias en el scope.

• Los Dangling pointers aparecen cuando un objeto que es referenciado por un


puntero es eliminado o reasignado, sin modificar el valor del puntero, de tal manera
que el puntero aún referencia a la ubicación de memoria desasignada.
Punteros nulos
• Un puntero nulo tiene un espacio reservado para indicar que el puntero no referencia
a un objeto válido. Se utiliza los punteros nulos para representar condiciones, como
el final de una lista de tamaño desconocido o la falla para realizar alguna acción.
Aritmética de punteros
• La aritmética de punteros es poder modificar la dirección a la que apunta un puntero
con una operación aritmética (así como hacer comparaciones). Agregar o restar
números a un puntero lo mueve multiplicando esa cantidad por el tamaño del tipo de
dato al que apunta el puntero. Por ejemplo. Si se añade 1 a un puntero que
referencia un entero de 4 bytes, el valor del puntero se aumentará en 4 (4 x 1 = 4).
Esto tiene el efecto de incrementar el puntero para que referencie al elemento
contiguo en un arreglo de enteros.

• Solo se permite la adición y substracción.


Aritmética de punteros
• Suponiendo que se tiene los siguientes 3 punteros y que apuntan a las ubicaciones
1000, 2000 y 3000 en la memoria.

• Sal realizar las siguientes operaciones apuntarán a las direcciones 1001, 2002 y
3004, respectivamente. Recordar que un char ocupa 1 byte, un short 2 bytes y un
long 4 bytes.
Aritmética de punteros

También podría gustarte