M4T7 Estructuras de Datos Dinámicas Punteros

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 13

Estructuras de datos dinámicas:

punteros
Fundamentos de programación
CONTENIDO
1. Objetivos

2. Introducción

3. Concepto. Definición de puntero

4. Operadores y operaciones con punteros

5. Arrays de punteros

6. Punteros y arrays

7. Punteros a cadenas

8. Punteros a estructuras

9. Indirección múltiple

10. Punteros a funciones

11. Paso de funciones, estructuras y arrays como


parámetros de funciones

12. Conclusiones

13. Bibliografía
Estructuras de datos dinámicas: punteros 3

Objetivos posición del puntero posición de la variable

• Comprender el concepto y cómo se definen los


Dirección 500
punteros.
• Entender los diferentes operadores y operaciones Variable puntero Dato direccionado por puntero
que se pueden realizar con los punteros.
Figura 1. Un puntero es una variable que contiene una dirección [2].
• Conocer cómo se define y usan los arreglos de
punteros.
Los punteros, de forma general, son variables igual que
• Comprender los punteros y arreglos. cualquier otro tipo de datos y, por tal motivo, debe ser
• Entender el uso de los punteros a cadenas y a definida. Su sintaxis es la siguente:
estructuras.
• Conocer el concepto y uso de la indirección múltiple. <tipo> *<nombre>;
• Comprender el uso de punteros en las funciones. Ejemplo:
• Entender el paso de funciones, estructuras y
arreglos como parámetros de funciones.

Introducción
Un puntero es una variable que almacena un valor
Figura 2. Ejemplo de definición de punteros.
de memoria y el uso de este. Se utilizan para que las
operaciones, que se deben realizar en la memoria
RAM del ordenador, sean más eficientes, tanto en la En el caso de los punteros void, estos son unos punteros
administración de recursos como de la cantidad de especiales, ya que no están asociados a algún tipo de
código que se necesitaría para realizar las operaciones dato en particular, si no que, una vez declarados, se le
sin el uso de estos. puede asignar cualquier tipo de valor, lo que permite que
el tamaño del puntero pueda variar y estar asociado al
tipo de dato que apunta. Su sintaxis es la siguiente:
Concepto. Definición void *<nombre>;
de puntero
En los sistemas informáticos, es normal que existan
situaciones en donde no se pueda determinar el
Operadores y operaciones
tamaño máximo que puede necesitar una variable de con punteros
memoria y asignarle toda la memoria del ordenador
Los punteros son objetos muy similares a los números
a una sola variable es improcedente y quizás resulte
enteros y existen diferentes operaciones definidas que
hasta insuficiente. Para estos casos, es necesario hacer
se pueden realizar con estos, como, por ejemplo, se
uso de las variables dinámicas que permiten ampliar
pueden comparar los punteros con el uso de expresiones
el tamaño o comprimirse según las necesidades. Las
lógicas con la finalidad de ver si dos punteros hacen
variables dinámicas son representadas con un tipo de
referencia a la misma dirección de memoria, también se
dato conocido como el puntero.
puede sumar o restar un entero para producir una nueva
Un puntero es un objeto utilizado en los lenguajes de localización de memoria.
programación para definir una variable que permita
Algunos de los operadores que sirven para manipular los
el almacenamiento de la dirección de memoria de un
punteros en C++ son los siguientes [3] (tabla 1):
objeto. El valor de dicha dirección se puede obtener con
el proceso de desreferenciación del puntero (figura 1). Si
se desea hacer una analogía, el número de página puede
considerarse como el puntero e ir al contenido de dicha
página sería el proceso de desreferenciación [1].
Estructuras de datos dinámicas: punteros 4

Operador Acción En el caso de C++, los punteros son utilizados ampliamente


para tres propósitos fundamentales [4]:
*p Contenido
&x Puntero a un objeto • Pasar funciones a otras funciones
p[i] Elemento de un vector • Asignar nuevos objetos en el montón
p->m Selección de miembros de una • Recorrer de forma iterativa los elementos que
clase
componen una matriz u otras estructuras de datos.
++p Preincremento al siguiente
elemento Aritmética de punteros
p++ Postincremento al siguiente
elemento Se pueden sumar o restar valores enteros para apuntar
--p Predecremento al elemento a registros de memorias que se encuentren antes o
anterior después de la memoria referenciada (figura 3).
p-- Postdecremento al elemento
anterior
p += n Incremento en n elementos
p -= n Decremento en n elementos
p+n Offset en n elementos
p-n Offset en n elementos
new T Reserva de memoria para el
objeto T
new T[n] Reserva memoria para un vector
de n objetos de tipo T
delete p Libera la memoria reservada
para p
delete [] p Libera la memoria reservada
para un vector de objetos

Tabla 1. Operadores que manipulan los punteros en C++.

Figura 3. Operaciones aritméticas con punteros.


Estructuras de datos dinámicas: punteros 5

En el siguiente caso se considera lo siguiente:


Arrays de punteros
• Se tiene un apuntador denominado “p”
Los punteros, al ser variables de memoria, pueden
• Una matriz llamada “v” de 10 integers almacenarse en arrays como si fuese cualquier tipo de
dato. El ejemplo más común de los arrays de punteros
Algunas de las operaciones más comunes que se
es el de las cadenas de caracteres, donde cada entrada
realizan con los punteros son las siguientes:
en el arreglo es, en sí, un puntero al primer carácter de
cada cadena. En este tipo de arrays el fin de la cadena la
determina el carácter binario cero.
p=v Copia un puntero
p Apunta a lo posición inicial de vector La sintaxis de definición de los arrays de punteros es la
p+0 Apunta a la posición inicial del vector
siguiente:
p+1 Apunta a la segunda posición del vector <tipo> *<nombre_arreglo>[tamaño_arreglo]
p+2 Apunta a la tercera posición del vector
Si se desea inicializar los valores de los punteros durante
p+n Si n es <= al tamaño máximo del vector, apuntará
a la posición n del vector la definición, se debe de utilizar la sintaxis:
p=&v[9] p apunta a la última posición del vector v <tipo> *<nombre_arreglo>[tamaño_arreglo] = {
p-1 p apunta a la posición anterior &variable1, &variable2, …, &variablen}
p-n p apunta a la n posición anterior a la actual
Un ejemplo en C++ que permite mantener el valor de 5
Tabla 2. Operaciones comunes con punteros. variables diferentes y que estén apuntadas en un arreglo
de punteros, es el siguiente (figura 4):

Figura 4. Ejemplo de arrays de apuntadores.

Punteros y arrays Si, por ejemplo, se define un puntero y un arreglo de la


siguiente forma:
Los punteros y arrays tienen mucho en común, ya que,
double *puntero:
para el compilador del lenguaje de programación, ambos
apuntan a direcciones de memorias. Sin embargo, double arreglo[100];
existen grandes particularidades que los diferencian.
Los arrays son un conjunto de elementos acotados de Y si se desea que el puntero haga referencia a la primera
un mismo tipo de dato y los punteros son variables que posición del arreglo, se debe de inicializar el puntero con
permiten acceder a otra variable que se encuentre en la el arreglo.
memoria RAM del ordenador.
puntero = arreglo;
El C++ el puntero se declara con el símbolo de asterisco
delante del nombre de la variable, sin olvidar especificar También se puede usar:
primero el tipo de variable al que apuntará. puntero = &arreglo[0];
<tipo> *<nombre>; Un ejemplo para diferencia entre el uso de punteros y
arrays es el siguiente (figura 5):
Estructuras de datos dinámicas: punteros 6

Figura 5. Uso de punteros y arrays.

Punteros a cadenas Esto permite reservar el espacio en la memoria RAM


para la cadena. Una vez que se dispone del espacio
Dado que en C++ las cadenas de textos son arrays de reservado, se puede crear el apuntador a esta cadena.
caracteres (char) que finalizan con un carácter binario Esto se logra mediante la sintaxis:
cero, que se escribe como ‘\0’, mediante la aritmética de
char *<nombre_apuntador>;
punteros se pueden recorrer los elementos de la cadena
desde su principio hasta el fin, de la misma forma como nombre_apuntador = nombre_cadena;
si se utilizara los índices en un arreglo de caracteres.
Esto permite disponer de diferentes herramientas para En el siguiente ejemplo se explica cómo se recorre la
recorrer las cadenas, ajustándose a las necesidades de cadena de caracteres a través del uso de punteros.
los sistemas informáticos y lógica computacional. Primero, se define, para el ejemplo, dos arreglos de 30
caracteres, cada uno que ocupara en la memoria RAM 60
Una cadena se puede definir con la sintaxis: bytes en total (figura 6).
char <nombre_cadena> [tamaño_de_la_cadena];

Figura 6. Ejemplo del uso de punteros a cadenas.


Estructuras de datos dinámicas: punteros 7

Punteros a estructuras De forma general, la sintaxis que se utiliza para la


declaración de punteros a estructuras es la siguiente:
Las estructuras permiten alojar datos de diferentes
<tipo_objeto> * <etiqueta_puntero> [ = <iniciador> ]
tipos bajo una misma estructura de datos. Los punteros
pueden estar asociados a todo tipo de datos, inclusive, a Donde el <tipo_objeto> hace referencia a la estructura
los del tipo de estructuras los cuales son muy utilizados que se desea utilizar y el <iniciador> a la estructura que
en las estructuras dinámicas de datos. En este tipo de se desea haga referencia el apuntador de estructura.
puntero se puede acceder a los datos de dos formas
diferentes, una es utilizando el operador punto “.” y otra Ejemplo del uso de punteros con estructuras (figura 7):
usando el comando flecha “->”.

Figura 7. Ejemplo de apuntadores con estructuras.

Indirección múltiple En la memoria RAM no solo se almacenan datos, sino


que se pueden almacenar direcciones de memorias.
Con la indirección se puede hacer una referencia Si se tiene un registro de memoria que apunta a
indirecta a los datos, mediante el uso de las direcciones otro registro que, a su vez, tiene otra dirección de
de memoria que contiene los datos. La indirección memoria, se está frente a una indirección múltiple. Esta
múltiple hace referencia a un método que se conoce indirección puede llegar a repetirse un número finito de
como direccionamiento indirecto. Este se utiliza cuando veces (figura 8).
se dispone de un determinado valor, que resulta ser una
dirección de memoria al cual se desea llegar para extraer
la información que este campo de memoria almacena.
Se puede decir que es un apuntador de apuntadores de
memoria.

Indirección múltiple para acceder a un dato


0x00000100 0x00000200 0x00000300 0x00000400
0x00000200 0x00000300 0x00000400 0x0153F2AB

Figura 8. Indirección múltiple [5].


Estructuras de datos dinámicas: punteros 8

Hay que recordar que un puntero de puntero es una forma Un ejemplo básico de esta situación es el siguiente
de indirección múltiple, se puede conseguir el valor de una (figura 9):
variable viendo a la dirección que apunta otra variable.

Figura 9. Ejemplo de indirección múltiple.

Hay que recordar que, si un puntero F apunta hacia un tipo En el siguiente ejemplo se hace referencia a este caso
de datos D, la sintaxis: *F es del tipo D. Si, por ejemplo, práctico donde se visualizará el lugar de almacenamiento
D es un puntero, entonces *F apuntará al puntero D. de la variable del dato y los diferentes apuntadores y, a
su vez, la dirección que hace referencia los diferentes
apuntadores (figura 10).

Figura 10. Ejemplo de indirección múltiple.


Estructuras de datos dinámicas: punteros 9

Punteros a funciones <tipo de dato devuelto> (* nombre_del_puntero) (lista de


parámetros);
Los punteros no solo apuntan a los tipos de datos de
Y, para asignar al puntero a una función específica que
un programa, sino que pueden apuntar a cualquier parte
cumpla con su definición, se utiliza la sintaxis:
de la memoria RAM, inclusive, aquellas en donde se
encuentran las definiciones de las funciones, aquí ya nombre_del_puntero=nombre_de_la_funcion;
difiere un poco su uso, ya que no está apuntando a los
datos como tal, sino, directamente, a la línea de inicio Por ejemplo, si se desea realizar un apuntador a
del código ejecutable de la función de los sistemas funciones que permita con el mismo apuntador sumar
informáticos. y restar dos números enteros, se debe de realizar la
siguiente programación (figura 11):
Si se desea almacenar la dirección de una función, se
debe utilizar un puntero a función, esto permite que
la función pueda ser invocada por el mismo puntero
cuando lo necesite y es de gran utilidad porque permite
encapsular el comportamiento de las rutinas de
programación mediante el llamado de las funciones a
través de punteros. Su sintaxis de uso es la siguiente:

Figura 11. Ejemplo del uso de punteros a funciones.

Si se desea definir el puntero y, a su vez, asignarlo a la


función que debe de apuntar, se debe de especificar con
la siguiente sintaxis:

<tipo de dato devuelto> (* nombre_del_puntero) (lista de


parámetros) = <nombre_de_la_funcion>;

Un ejemplo de una definición de apuntador a función y


su respectiva asignación a una función, es el siguiente
(figura 12):
Estructuras de datos dinámicas: punteros 10

Figura 12. Definición del apuntador de función y asignación.

Paso de funciones,
estructuras y arrays como
parámetros de funciones
Las funciones del lenguaje C++ no permiten cambiar, de
forma directa, el contenido de las variables que se envían
por valor. Para lograr el cambio, la función se debe enviar
el puntero hacia la dirección de memoria que contiene el Figura 13. Ejemplo de envío de parámetros por referencia.
dato almacenado de la variable, con el fin de que pueda
ser modificado por las instrucciones de las funciones a
medida que se ejecutan. Paso de un arreglo unidimensional como parámetro de
una función: los arreglos son enviados por referencia
Las funciones permiten el envío de múltiples tipos de como parámetro de la función, nunca son enviados por
datos, inclusive, aquellos de tipo estructura, arreglos de valor. Para el envío del arreglo en la función se puede
memoria e, inclusive, otras funciones. Esto le permite utilizar dos sintaxis:
procesar todo tipo de información y ejecutar, antes de
invocar la función, el procesamiento de algoritmos • Utilizando corchetes []
complejos para entregar un valor como parámetro a la • Utilizando el estilo puntero con el uso del asterisco
función que se desea invocar. *

Paso de parámetros por referencia a una función: Un ejemplo del uso del arreglo unidimensional, como
aquí se envía la dirección de memoria en donde están parámetro de la función con el uso de ambas sintaxis, es
almacenados los datos de la variable que se desea el siguiente (figura 14):
modificar. Para ello, se debe utilizar en la definición de la
función la siguiente sintaxis:

<tipo de dato devuelto> <nombre_de_la_función>


(<tipo1> <*variable1>, (<tipo2> <*variable2> )

Un ejemplo del paso de parámetros por referencia en


una función que permite intercambiar los valores entre
las variables es el siguiente (figura 13):
Estructuras de datos dinámicas: punteros 11

Figura 14. Ejemplo de envío de arreglo unidimensional como parámetros por referencia.

Paso de estructuras a una función: los punteros pueden Un ejemplo del uso de estructura en una función que
declararse para que apunten a una estructura. Estos permita enviar los valores de los datos de la estructura
apuntadores pueden enviarse como parámetros a las por referencia y por valor es el siguiente (figura 15):
funciones y manipular los datos dentro de la función con
los comandos flecha “->”.
Estructuras de datos dinámicas: punteros 12

Figura 15. Ejemplo de uso de estructuras con funciones [6].


Estructuras de datos dinámicas: punteros 13

Conclusiones [3] B. Feunte Arenaz, “Operaciones con punteros”, 1997.


[En línea]. Disponible en: http://fpsalmon.usc.es/
Los punteros se pueden considerar como los precursores genp/doc/cursos/C++/punteros/operations.html
del almacenamiento dinámico de los datos. Estos no [Último acceso: 04 abril 2022].
almacenan los datos como tal, sino que guardan las [4] Microsoft, “Punteros (C++)”, 2022. [En línea].
direcciones de memoria que apunta a las variables que Disponible en: https://docs.microsoft.com/es-es/
contiene dichos datos. Esto permite que pueda existir un cpp/cpp/pointers-cpp?view=msvc-170 [Último
gran abanico de opciones para modificar o visualizar los acceso: 04 febrero 2022].
datos mediante el uso de las funciones, lo que posibilita [5] Wikipedia, “Indirección”, 2020. [En línea]. Disponible
que se puedan utilizar datos especiales como las en: https://es.wikipedia.org/wiki/Indirecci%C3%B3n
estructuras, los arreglos, entre otros y no limitarse con [Último acceso: 05 abril 2022].
los tipos de datos primitivos que existen.
[6] Escuela Politécnica Superior Universidad de Alcalá,
“Apuntes de ‘programación’”, 2018. [En línea].
Bibliografía Disponible en: https://portal.uah.es/portal/page/
portal/epd2_asignaturas/asig350009/informacion_
[1] Wikipedia, “Puntero (informática)”, 2021. [En academica/DiapositivasTeoria2019.pdf [Último
línea]. Disponible en: https://es.wikipedia.org/wiki/ acceso: 2022 abril 06].
Puntero_(inform%C3%A1tica) [Último acceso: 04
abril 2022].
[2] Wikipedia, “Puntero (informática)”, 2021. [En
línea]. Disponible en: https://es.wikipedia.org/wiki/
Puntero_(inform%C3%A1tica) [Último acceso: 04
abril 2022].

También podría gustarte

pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy