Está en la página 1de 27

INSTITUTO POLITÉCNICO NACIONAL

ESCUELA SUPERIOR DE COMPUTO

FUNDAMENTOS DE PROGRAMACIÓN

ALUMNO: DE LOS SANTOS GUZMÁN DANIEL


TONATIUH

2024630521

REPORTE: UNIDAD 2 “APUNTADORES, TIPOS DE


DATOS ESTRUCTURADOS Y FUNCIONES”
Índice

Introducción………………………………………………………………………………04

Marco Teórico…………………………………………………………………………….09

Desarrollo…………………………………………………………………………………12

2.1 Apuntadores……………………………………………...………………..…12

2.1.1 Apuntadores y direcciones de memoria…………………………….…...12

2.1.2 Operadores de dirección e indirección…………………………………..12

2.1.3 Aritmética de apuntadores……………………………..…………………13

2.1.4 Manejo de arreglos con apuntadores…………………………………….14

2.2 Datos definidos por el usuario………………………………………………15

2.2.1 Declaración de una estructura……………………………………………15

2.2.2 Instancia de estructura y apuntador a estructura…………………….…16

2.2.3 Operadores de estructura………………………………………..…….…16

2.2.4 Arreglos de estructuras…………………………………,,,,………………17

2.2.5 Estructuras anidadas………………………………………………………17

2.3 Funciones………………………………………….…………………………18

2.3.1 Funciones………………………………………..…………………………18

2.3.2 Argumentos y parámetros…………………...……………………………19

2.3.3 Paso por valor y paso por referencia………………..……………………19

2.3.4 Retorno de la función………………………………………………………20

2.3.5 Bibliotecas creadas por el usuario………………………………………..20

2.4 Funciones recursivas……………………………………………………..…21


2.4.1 Recursión…………………………………………………………..………21

2.4.2 Pasos base y pasos recursivos…………………………………..………21

2.4.3 Tipos de recursión…………………………………………………………23

2.4.4 Recursión versus iteración………………………………………………..23

Conclusión………..………………………………………………………………………25

Bibliografía……………………………………………………………………………..…27
Introducción

"Apuntadores, Tipos de Datos Estructurados y Funciones" son conceptos


fundamentales en la programación, especialmente en lenguajes como C, C++, y
otros. Estos elementos desempeñan un papel crucial en la creación de programas
eficientes y flexibles. En este artículo, exploraremos en detalle estos conceptos para
comprender su importancia en el desarrollo de software.

Los apuntadores son uno de los conceptos más poderosos y, a veces, complicados
en la programación. En esencia, un apuntador es una variable que almacena la
dirección de memoria de otra variable. Esto permite un mayor control sobre los datos
y una gestión más eficiente de la memoria en programas. Los apuntadores se
utilizan para acceder y manipular datos en lugar de copiarlos, lo que ahorra recursos
y mejora el rendimiento de las aplicaciones.

Un uso común de los apuntadores es la asignación dinámica de memoria. En lugar


de reservar una cantidad fija de memoria en tiempo de compilación, los
programadores pueden asignar y liberar memoria en tiempo de ejecución según sea
necesario. Esto es esencial para crear estructuras de datos dinámicas como listas
enlazadas, pilas y colas, que pueden crecer o reducirse según las necesidades del
programa.
Además de la asignación dinámica de memoria, los apuntadores son esenciales en
la manipulación de cadenas de caracteres. En C, por ejemplo, las cadenas son
simplemente secuencias de caracteres almacenadas en memoria con un carácter
nulo al final. Los apuntadores se utilizan para acceder y modificar elementos
individuales de una cadena o recorrerla por completo. Esto es fundamental en el
procesamiento de texto y la manipulación de datos.

Otro aspecto importante de los apuntadores es su capacidad para trabajar con


arreglos. En muchos lenguajes de programación, los arreglos son estructuras de
datos que almacenan una colección de elementos del mismo tipo. Los apuntadores
pueden utilizarse para acceder y modificar elementos de un arreglo de manera
eficiente. También permiten la creación de arreglos dinámicos cuyo tamaño puede
variar durante la ejecución del programa.

Los apuntadores son una herramienta poderosa, pero también pueden ser fuente
de errores difíciles de depurar, como las referencias a direcciones de memoria
incorrectas (errores de segmentación) o fugas de memoria. Por lo tanto, es esencial
comprender y utilizar los apuntadores con cuidado y seguir prácticas recomendadas
para evitar problemas en el código.

Pasemos ahora a los tipos de datos estructurados. Los tipos de datos estructurados
son aquellos que permiten combinar varios valores en una sola entidad. Ejemplos
comunes de tipos de datos estructurados incluyen estructuras, uniones y clases en
lenguajes orientados a objetos.
Las estructuras permiten a los programadores definir un nuevo tipo de dato que
puede contener múltiples campos o variables de diferentes tipos. Esto es útil para
representar entidades complejas en un programa. Por ejemplo, se puede utilizar
una estructura para definir un tipo de dato "persona" con campos como nombre,
edad y dirección.

Las uniones son similares a las estructuras, pero solo almacenan un valor a la vez.
Esto puede ser útil cuando se necesita representar diferentes tipos de datos en una
sola entidad. Por ejemplo, una unión podría ser utilizada para almacenar una fecha
como día, mes y año, pero solo uno de estos campos estaría ocupado en un
momento dado.

Las clases son el concepto de tipo de dato estructurado más común en lenguajes
de programación orientados a objetos como Java, C# y Python. Las clases permiten
definir objetos con propiedades (campos) y comportamiento (métodos). Esto facilita
la creación de programas más organizados y reutilizables al modelar entidades del
mundo real y su interacción.

La combinación de apuntadores y tipos de datos estructurados permite crear


estructuras de datos más complejas y eficientes. Por ejemplo, se pueden crear listas
enlazadas que almacenan elementos de una estructura de datos personalizada,
como un tipo de dato "estudiante" con campos para nombre, edad y calificaciones.
Los apuntadores se utilizan para conectar los nodos de la lista enlazada y acceder
a los datos de cada estudiante.

Además de los apuntadores y los tipos de datos estructurados, las funciones son
una parte fundamental de la programación. Las funciones permiten dividir un
programa en módulos más pequeños y manejables. Cada función realiza una tarea
específica y puede ser llamada desde otras partes del programa.
Las funciones son esenciales para la reutilización de código, ya que una función
bien diseñada y probada puede ser llamada en múltiples lugares sin duplicar el
código. Esto mejora la legibilidad y el mantenimiento del programa, ya que los
errores solo deben corregirse en un solo lugar.

Al crear una función, se definen sus parámetros y su tipo de retorno. Los parámetros
son valores que se pasan a la función cuando se llama y pueden utilizarse dentro
de la función. El tipo de retorno especifica qué tipo de valor devuelve la función una
vez que ha completado su tarea.

Las funciones pueden ser llamadas de manera recursiva, lo que significa que una
función puede llamarse a sí misma. Esto es útil en algoritmos recursivos, como el
cálculo de números factoriales o la búsqueda en árboles binarios.

Las funciones también son una parte importante de la programación orientada a


objetos. En este paradigma, las funciones se denominan métodos y se asocian a
clases. Los métodos definen el comportamiento de los objetos creados a partir de
una clase. Esto permite encapsular datos y funcionalidad relacionada en una sola
entidad, lo que mejora la organización y la claridad del código.

Los apuntadores, los tipos de datos estructurados y las funciones son conceptos
esenciales en la programación. Los apuntadores permiten un mayor control sobre
la memoria y la manipulación de datos, mientras que los tipos de datos
estructurados permiten la creación de estructuras de datos complejas y
organizadas. Las funciones dividen el programa en módulos reutilizables y mejoran
la legibilidad y el mantenimiento del código. Comprender y dominar estos conceptos
es fundamental para convertirse en un programador eficiente y competente.
Marco Teórico

Apuntadores: Los apuntadores son una característica esencial en lenguajes de


programación como C y C++, que ofrecen un mayor control sobre la memoria y
permiten una gestión más eficiente de los datos en un programa. Un apuntador es
una variable que almacena la dirección de memoria de otra variable. Esto facilita la
manipulación directa de los datos en la memoria, lo que ahorra recursos y mejora el
rendimiento. Algunos conceptos clave relacionados con apuntadores incluyen:

• Declaración de Apuntadores: Para declarar un apuntador, se utiliza el


operador '*' seguido del tipo de dato al que apuntará. Por ejemplo, int *ptr
declara un apuntador a un entero.
• Operaciones con Apuntadores: Los apuntadores permiten realizar diversas
operaciones, como la asignación de valores a través de la des referenciación
(*ptr = 10), la aritmética de apuntadores (incremento y decremento de
apuntadores) y la comparación de apuntadores.
• Asignación Dinámica de Memoria: Los apuntadores se utilizan para la
asignación dinámica de memoria en tiempo de ejecución. Esto es
especialmente útil cuando se necesita gestionar la memoria de manera
flexible, como en la creación de estructuras de datos dinámicas como listas
enlazadas.
• Apuntadores a Funciones: En lenguajes como C, los apuntadores pueden
utilizarse para almacenar la dirección de funciones. Esto permite la creación
de estructuras de control dinámicas y la implementación de conceptos como
los callbacks.
• Problemas Comunes: Los apuntadores pueden ser fuente de errores difíciles
de depurar, como la referencia a direcciones de memoria incorrectas (errores
de segmentación) o fugas de memoria. Es esencial seguir buenas prácticas
al trabajar con apuntadores para evitar estos problemas.

Tipos de Datos Estructurados: Los tipos de datos estructurados son una extensión
natural de los tipos de datos simples (enteros, flotantes, caracteres, etc.). Permiten
combinar múltiples valores en una sola entidad, lo que es fundamental para
representar estructuras de datos más complejas. Algunos de los tipos de datos
estructurados más comunes son:

• Estructuras: Las estructuras permiten definir un nuevo tipo de dato que puede
contener múltiples campos de diferentes tipos. Por ejemplo, se puede definir
una estructura "Persona" con campos para el nombre, la edad y la dirección.
• Uniones: Las uniones son similares a las estructuras, pero solo almacenan
un valor a la vez. Esto puede ser útil cuando se necesita representar
diferentes tipos de datos en una sola entidad, como en el caso de una unión
que almacena una fecha o una hora.
• Clases (en lenguajes orientados a objetos): En lenguajes de programación
orientados a objetos como Java y C#, las clases son tipos de datos
estructurados que combinan datos (atributos) y comportamiento (métodos).
Las clases permiten modelar entidades del mundo real y su interacción de
manera más efectiva.
• Enumeraciones: Las enumeraciones son un tipo de datos estructurados que
permiten definir un conjunto de constantes con nombres descriptivos. Esto
mejora la legibilidad y el mantenimiento del código.
• Tipos de Datos Abstractos (ADT): Los ADT son tipos de datos estructurados
definidos por el usuario que encapsulan datos y operaciones relacionadas.
Los ADT son una parte fundamental de la programación orientada a objetos
y permiten la creación de abstracciones más complejas.

Funciones: Las funciones desempeñan un papel crucial en la programación al


permitir dividir un programa en módulos más pequeños y manejables. Cada función
realiza una tarea específica y puede ser llamada desde otras partes del programa.
Algunos conceptos clave relacionados con funciones incluyen:

• Declaración de Funciones: Para declarar una función, se especifica su


nombre, los parámetros que acepta y su tipo de retorno. Por ejemplo, int
suma (int a, int b) declara una función llamada "suma" que toma dos enteros
y devuelve un entero.
• Llamada de Funciones: Las funciones se llaman utilizando su nombre
seguido de argumentos. Por ejemplo, resultado = suma(5, 3) llama a la
función "suma" con los argumentos 5 y 3 y almacena el resultado en la
variable "resultado".
• Recursividad: La recursividad es un concepto en el que una función se llama
a sí misma. Esto es útil para resolver problemas que se pueden descomponer
en subproblemas similares, como el cálculo de números factoriales o la
búsqueda en estructuras de datos como árboles.
• Retorno de Valores: Las funciones pueden devolver valores utilizando la
instrucción "return". El valor devuelto puede ser utilizado en la llamada a la
función.
• Ámbito de Variables: Las variables declaradas dentro de una función tienen
un ámbito local, lo que significa que solo son visibles y accesibles dentro de
la función. Las variables globales son visibles en todo el programa.
• Paso de Parámetros: Los parámetros de una función se pueden pasar por
valor (una copia de la variable original) o por referencia (una referencia a la
variable original). El paso por referencia permite modificar la variable original
dentro de la función.
• Sobrecarga de Funciones (en lenguajes como C++): La sobrecarga de
funciones permite definir múltiples funciones con el mismo nombre pero
diferentes parámetros. El compilador seleccionará la función apropiada en
función de los argumentos proporcionados en la llamada.

Los apuntadores, los tipos de datos estructurados y las funciones son conceptos
fundamentales en la programación que permiten una gestión eficiente de los datos,
la creación de estructuras de datos complejas y la división de un programa en
módulos reutilizables. Comprender estos conceptos es esencial para desarrollar
software eficiente y bien estructurado.
Desarrollo

2.1 Apuntadores

2.1.1 Apuntadores y direcciones de memoria

Los apuntadores son variables que se utilizan para almacenar direcciones de


memoria donde se está guardando otra variable.

El valor de un puntero “apunta” a una variable, a la cual se puede acceder


indirectamente con los operadores especiales sobre punteros * y &.

El operador * accede al contenido de una variable cuya dirección es el valor de un


putero, se puede recordar con “en la dirección”.

El operador & devuelve la dirección de una variable y se puede recordar con “la
dirección de”.

La declaración de un puntero de forma general es: Tipo_dato *nombre_apuntador.

2.1.2 Operadores de dirección e indirección

Operador de dirección nos regresa la dirección de una variable.


Operador de indirección, este operador toma la dirección de una variable y regresa
el dato que contiene esta dirección. (int *punt;)

2.1.3 Aritmética de apuntadores

La aritmética de apuntadores nos permite manipular direcciones de memoria y


acceder a datos almacenados en esas ubicaciones de memoria.

Recordemos que un apuntador es una variable que almacena la dirección de


memoria de otra variable o dato.

Sumar o restar un valor entero a un apuntador se traduce en moverse ese número


de elementos en la memoria.

Existen dos operadores especiales de apuntadores:

’&’: este operador es de dirección y se usa para obtener la dirección de una variable.

’*’: este operador es de indirección y se usa para acceder al valor al que apunta un
apuntador. Recuerda que, si queremos modificar el valor del apuntador, ya no
requerimos del operador asterisco.

Operaciones aritméticas:

• ++: Incrementar apuntador


• --: Decrementar un aputador
• +0+=: Sumar un entero a un apuntador
• -0-=: Restar un entero de un apuntador
2.1.4 Manejo de arreglos con apuntadores

Los apuntadores pueden ser utilizados en cualquier operación que involucre


subíndices de arreglos.

El nombre de un arreglo también es un apuntador al primer elemento del arreglo.

a[i] es equivalente a decir *(a+i). ‘a’ solo es la dirección de memoria del primer
elemento del arreglo, es decir &a[0].

Si se asigna el puntero al arreglo podemos manipular el arreglo con el puntero del


mismo modo.

Se pueden direccionar arreglos como si fueran apuntadores y apuntadores como si


fueran arreglos.
2.2 Datos definidos por el usuario

Los datos definidos por el usuario son tipos de datos personalizados que sedefinen
por el programador. Estos tipos de datos se pueden utilizar para representar datos
que no se pueden representar con los tipos de datos incorporados, comodatos
complejos o estructuras de datos.

Tipos de UDTS:

• Clases: Contiene sus propios miembros de datos y funciones de miembros.


• Estructuras: Una estructura crea un tipo de datos que se puede usar para
agrupar elementos.
• Uniones: Las uniones son una construcción similar a las estructuras, pero
con una diferencia fundamental: en una unión, todos sus miembros
comparten el mismo espacio de memoria. Esto significa que, en una unión,
solo uno de sus miembros puede tener un valor válido en un momento dado.
• Enumeración: Las enumeraciones son útiles para hacer que el código sea
más legible y comprensible al asignar nombres descriptivos avalores enteros.
• Typedef: La declaración “typedef” se usa para proporcionar un nombre más
conveniente o legible a un tipo de datos, loque puede hacer que el código
sea más claro y fácil de mantener.

2.2.1 Declaración de una estructura

En lenguaje C, para declarar una estructura lo haremos mediante la palabra clave


“struct”.

Una estructura es una colección de variables de diferentes tipos de datos que se


agruparán bajo un mismo nombre.

• NombreEstructura es el nombre que le das a la estructura.


• tipoDato1, tipoDato2, son los tipos de datos de los miembros de la estructura
(pueden ser int, float, char, u otros tipos de datos).
• miembro1, miembro2, etc., son los nombres de los miembros de la estructura.
2.2.2 Instancia de estructura y apuntador a estructura

En C, una instancia de estructura es un objeto concreto basado en una plantilla de


estructura definida. Esto permite a los desarrolladores trabajar con datos
estructurados como una sola entidad. Por ejemplo, si definimos una estructura con
atributos como "nombre," "edad" y "dirección," podemos crear instancias de esta
estructura para representar a personas individuales y manipular sus atributos
directamente.

Los punteros de estructura en C++ son referencias a ubicaciones de memoria que


almacenan datos de estructura. Son eficientes en el uso de la memoria para
conjuntos de datos grandes al administrar solo las direcciones de memoria,
reduciendo la sobrecarga y mejorando el rendimiento. Los desarrolladores acceden
a los miembros de la estructura utilizando el operador de flecha (->) cuando trabajan
con punteros de estructura.

2.2.3 Operadores de estructura

En C++, es posible definir operadores personalizados para estructuras con el fin de


llevar a cabo operaciones específicas en instancias de estas estructuras. La
sobrecarga de operadores como +, -, *, y / para estructuras permite a los
programadores realizar operaciones personalizadas que se ajusten a los datos
encapsulados dentro de la estructura. Por ejemplo, si tenemos una estructura
llamada "ComplexNumber," podemos definir el operador + para sumar dos números
complejos de manera sencilla.
2.2.4 Arreglos de estructuras

En C, los "arreglos de estructuras" se refieren a la creación de matrices o arrays


que almacenan elementos de tipo estructura. Las estructuras en C permiten
combinar diferentes tipos de datos en una sola entidad, lo que puede ser útil para
organizar y gestionar datos relacionados.

Un arreglo de estructuras se crea declarando una estructura y luego declarando una


matriz que contiene elementos de esa estructura.

2.2.5 Estructuras anidadas

Las estructuras anidadas en lenguaje C son una forma de organizar datos complejos
en una sola estructura. Una estructura anidada es una estructura dentro de otra
estructura. Esto permite una mayor flexibilidad en la organización de los datos y
facilita el acceso a ellos.
2.3 Funciones

2.3.1 Funciones

En programación, una función es un bloque de código que realiza una tarea


específica y se puede invocar o llamar desde otras partes del programa. Las
funciones se utilizan para organizar y modularizar el código, lo que facilita el
desarrollo de programas más grandes y complejos. Cada función tiene un nombre
único y puede aceptar parámetros como entrada, procesarlos y, opcionalmente,
devolver un resultado.

• Nombre de la Función: Cada función tiene un nombre que la identifica de


manera única en el programa. El nombre se elige de manera significativa
para describir la tarea que realizarla función.
• Cuerpo de la Función: El cuerpo de la función es un bloque de código que
contiene las instrucciones y declaraciones que definen lo que hace la función.
Estas instrucciones son ejecutadas cuando la función se llama.
• Variables Locales: Dentro del cuerpo de la función, se pueden declarar
variables locales. Estas variables solo son accesibles dentro de la función y
no afectan a otras partes del programa. Sirven para almacenar datos
temporales necesarios para la función.
• Alcance (Scope): El alcance de una función se refiere a la visibilidad de las
variables y objetos dentro de la función. Las variables locales solo son
visibles dentro de la función, mientras que las variables globales pueden ser
accedidas desde cualquier parte del programa.
2.3.2 Argumentos y parámetros

Los parámetros son variables definidas en la declaración de una función que actúan
como marcadores de posición para los valores que la función espera recibir. Estos
parámetros permiten que la función sea más flexible y pueda operar en diferentes
datos. Los parámetros son parte de la firma de la función y se especifican cuando
se define la función.

Los argumentos son los valores reales que se pasan a una función cuando se la
llama. Estos valores llenan los marcadores de posición representados por los
parámetros en la función. Los argumentos se proporcionan cuando se llama a la
función y deben coincidir en número y tipo con los parámetros de la función.

2.3.3 Paso por valor y paso por referencia

En el paso por valor, los argumentos se pasan a la función copiando su valor en una
variable local dentro de la función. Esto significa que cualquier modificación
realizada a la variable dentro de la función no afecta a la variable original en el punto
de llamada. En esencia, la función trabaja con copias de los datos originales.
En el paso por referencia, se pasa a la función una referencia o dirección de
memoria de la variable original en lugar de copiar su valor. Esto significa que
cualquier modificación realizada a la variable dentro de la función afecta
directamente a la variable original en el punto de llamada. El paso por referencia es
común en lenguajes de programación que admiten punteros o referencias explícitas.

2.3.4 Retorno de la función

El retorno de una función en programación se refiere al valor que una función


devuelve como resultado después de ejecutar sus operaciones. Las funciones
pueden ser diseñadas para realizar cálculos, procesar datos o llevar a cabo diversas
tareas, y el valor de retorno es la manera en que la función comunica su resultado
al código que la llamó.

El valor de retorno es especificado en la definición de la función y se puede utilizar


en otras partes del programa. Por ejemplo, si tienes una función que suma dos
números, el valor de retorno podría ser la suma de esos números, y podrías utilizar
este valor en otras partes de tu código.

2.3.5 Bibliotecas creadas por el usuario

Las bibliotecas creadas por el usuario, también conocidas como bibliotecas


personalizadas o bibliotecas propias, se refieren a conjuntos de funciones y/o
variables que un programador o un equipo de desarrollo crea y organiza para su
reutilización en diferentes programas o proyectos. Estas bibliotecas contienen
código que el usuario ha diseñado y desarrollado específicamente para abordar
necesidades particulares de programación o para encapsular funcionalidades
comunes.
2.4 Funciones recursivas

Las funciones recursivas tienen similitud con los bucles, pero no están basados en
una declaración condicional. La función se llama siempre que se requiere el mismo
código para ejecutarse de forma reiterada.

2.4.1 Recursión

Es aquella propiedad que posee una función que puede llamarse a sí misma. Sin
que se repita un número infinito de veces

La recursividad es una técnica de programación que busca resolver un problema


sustituyéndolo por otros problemas de la misma categoría, pero más simples
implementando un algoritmo recursivo.

2.4.2 Pasos base y pasos recursivos


Los pasos base son las condiciones que detienen la recursión y definen un caso
simple que no requiere una llamada recursiva. Son los casos en los que la función
recursiva devuelve un resultado directo sin realizar llamadas adicionales a sí misma.
Estos casos suelen ser los puntos de terminación de la recursión y evitan que la
función entre en un ciclo infinito.

Los pasos recursivos son las llamadas adicionales a la función que se hacen dentro
de la propia función. En estos pasos, la función se llama a sí misma con un conjunto
de datos más pequeño o modificado. La idea es que la función se resuelve de
manera progresiva a través de llamadas recursivas hasta que alcanza un paso base
que detiene la recursión.
La combinación de pasos base y pasos recursivos permite que las funciones
recursivas aborden problemas de manera más simple y eficiente. Los pasos base
garantizan que la recursión se detenga en algún momento, mientras que los pasos
recursivos permiten que la función se aproxime al resultado deseado resolviendo
instancias más pequeñas del problema en cada llamada recursiva.

2.4.3 Tipos de recursión

Recursividad directa: Se invoca a una segunda función que a su vez se invoca a la


primera
Recursividad indirecta: Cuando la función se invoca a sí misma se llama.
Recursividad infinita: Ocurre cuando al momento de hacer la recursión no reduce el
problema en cada ocasión de modo que converja sobre el caso base o condición de
salida.
Existen varios tipos de recursión:
• Recursión simple: En este tipo de recursión, una función se llama a sí misma
directamente para resolver un problema.
• Recursión indirecta o mutua: En la recursión mutua, dos o más funciones se
llaman entre sí de manera cíclica para resolver un problema. Esto puede ser
útil en situaciones en las que un problema se divide en subproblemas
manejados por funciones diferentes.
• Recursión de cola: En la recursión de cola, la llamada recursiva es la última
operación realizada dentro de la función. Esto permite que el compilador o
intérprete optimice la recursión y evite el desbordamiento de pila en lenguajes
que admiten la optimización de la cola.
• Recursión anidada: Una función recursiva se llama a sí misma como
argumento de otra llamada a una función recursiva. Esto puede ser útil en
problemas que tienen una estructura recursiva compleja.
• Recursión múltiple: En la recursión múltiple, una función recursiva realiza
múltiples llamadas recursivas, a menudo en paralelo. Esto es común en
problemas que involucran estructuras de datos complejas, como árboles.
2.4.4 Recursión versus iteración
La recursión y la iteración son dos enfoques diferentes para resolver problemas en
programación. Ambos tienen sus propias ventajas y desventajas, y la elección
entre uno u otro depende del problema específico y de las preferencias del
programador.
La iteración es la repetición de un conjunto de instrucciones o un bloque de código
un número específico de veces o hasta que se cumpla una condición determinada.
En lugar de resolver un problema mediante llamadas recursivas, la iteración utiliza
bucles para ejecutar una serie de instrucciones varias veces.
Conclusión

En conclusión, los conceptos de apuntadores, tipos de datos estructurados y


funciones son fundamentales en la programación y desempeñan un papel esencial
en la creación de software eficiente, organizado y reutilizable. Cada uno de estos
elementos aporta un conjunto único de capacidades y desafíos, y su comprensión
y dominio son esenciales para cualquier programador.

Los apuntadores son una característica poderosa, pero también pueden ser una
fuente de errores sutiles. Almacenar direcciones de memoria y acceder a datos en
la memoria directamente permite una mayor flexibilidad y eficiencia en la gestión de
datos. Sin embargo, también introduce el riesgo de errores de segmentación y fugas
de memoria si no se manejan adecuadamente. Para evitar estos problemas, es
crucial seguir prácticas recomendadas al trabajar con apuntadores, como
inicializarlos correctamente, liberar la memoria asignada dinámicamente y
garantizar que los apuntadores se utilicen solo para acceder a la memoria a la que
tienen permiso.

Los tipos de datos estructurados, como las estructuras, las uniones y las clases (en
lenguajes orientados a objetos), permiten a los programadores crear abstracciones
más complejas y organizadas. Estos tipos de datos son esenciales para representar
entidades del mundo real y sus relaciones en programas. Las estructuras, por
ejemplo, se utilizan para definir tipos de datos personalizados que contienen
múltiples campos de diferentes tipos, lo que facilita la representación de conceptos
complejos. Las clases llevan esto un paso más allá al permitir la encapsulación de
datos y comportamiento en una sola entidad, promoviendo la reutilización y la
organización del código.

En el contexto de los tipos de datos estructurados, los tipos de datos abstractos


(ADT) merecen una mención especial. Los ADT son una abstracción que define una
estructura de datos y un conjunto de operaciones que se pueden realizar en ella.
Estos tipos de datos abstraídos son esenciales en la programación orientada a
objetos y permiten a los programadores trabajar con conceptos de alto nivel sin
preocuparse por los detalles de implementación.
Las funciones, por su parte, desempeñan un papel central en la modularización y
organización del código. Dividen un programa en módulos más pequeños, cada uno
de los cuales realiza una tarea específica. Esto mejora la legibilidad del código y
facilita el mantenimiento, ya que los errores solo deben corregirse en un lugar, y las
funciones probadas y bien diseñadas se pueden reutilizar en diferentes partes del
programa.

La recursividad, un concepto relacionado con las funciones, permite a una función


llamarse a sí misma. Esto es útil en algoritmos recursivos y en la resolución de
problemas que se pueden descomponer en subproblemas similares. La recursividad
puede ser una herramienta poderosa, pero es importante usarla con precaución
para evitar bucles infinitos.

En un nivel más avanzado, la sobrecarga de funciones (como se encuentra en


lenguajes como C++) permite definir múltiples funciones con el mismo nombre pero
diferentes parámetros. Esto facilita la creación de interfaces más intuitivas y
genéricas, lo que es especialmente valioso en la programación orientada a objetos.

En resumen, los apuntadores, tipos de datos estructurados y funciones son


componentes esenciales de la programación. Su comprensión y uso adecuado son
cruciales para la creación de programas eficientes, organizados y reutilizables.
Cada uno de estos conceptos contribuye a la flexibilidad y la capacidad de
abstracción de un programador, permitiéndoles abordar problemas cada vez más
complejos y entregar soluciones de software efectivas. A medida que los
programadores avanzan en su aprendizaje y experiencia, estos conceptos se
vuelven herramientas indispensables en su caja de herramientas para abordar
desafíos de programación cada vez más sofisticados.
Bibliografía

• http://cidecame.uaeh.edu.mx/lcc/mapa/PROYECTO/libro4/412_relaciones_
entre_apuntadores_y_arreglos.html

• https://lenguajeprogramacionc.wordpress.com/apuntadores-y-arreglos/

• https://es.slideshare.net/diegoandresalvarez/08-punteros

• https://codingornot.com/03-apuntadores-null-y-aritmetica-conapuntadores

• https://www.uv.mx/personal/ermeneses/files/2021/08/Clase3-
AlmacenamientoDinamico-Apuntadores.pdf

• Joyanes, L. 2013 Fundamentos generales de programación Mc Graw Hill


Interamericana. ISBN
• Kernighan, B. & Ritchie, D. 1991 El lenguaje de programación C Prentice-
Hall. ISBN
• Ariken, P. Jones, B, Aprendiendo C en 21 días, Pearson
• Javier Caballos, F, Enciclopedia de lenguaje C, Alfaomega
• https://www.netmentor.es/entrada/Recursividad-programacion
• https://ehack.info/recursion-en-
c/#:~:text=Una%20funci%C3%B3n%20recursiva%20es%20una,basados%2
0en%20una%20declaraci%C3%B3n%20condicional.
• Joyanes, L. (2020). Fundamentos de Programación Algoritmos, estructura de
datos y objetos (5.a ed.,Vol. 1). McGraw-Hill.

También podría gustarte