INSTITUTO POLITÉCNICO NACIONAL
Unidad Profesional Interdisciplinaria en Ingeniería y
Tecnologías Avanzadas.
“Introducción a la programación”
Practica 7 “Uso de Apuntadores”
Profesor: José Luis Cruz Mora
PRESENTA:
PÉREZ RODRÍGUEZ EDGAR
GRUPO 1MV1
2 DE DICIEMBRE DE 2024.
Objetivo
Desarrollo de programas utilizando los apuntadores para el paso de parámetros por valor y
por referencia a funciones.
Introducción
El uso de punteros al momento de programa en lenguaje C es de suma importancia para
conseguir una mejora en los programas que se pueden realizar con las herramientas que se
nos proporcionan. Un puntero es un tipo de variable que guarda direcciones de memoria
de otras variables, lo cual es de suma utilidad. Estos punteros se pueden desreferenciar y
acceder al valor al que está apuntando, así como también puede modificar este valor, lo
cual nos permite modificar una variable sin siquiera llamarla, esto se utiliza para hacer
llamados de paso por referencia, donde se modifica el valor interno de una variable. Los
punteros se comportan de manera muy similar a los arreglos, por lo que pueden de alguna
manera remplazarlos en ciertos aspectos y resulta mucho más útil utilizar punteros para
ciertos aspectos al momento de programar.
Otro aspecto importante en la práctica es la memoria dinámica, al momento de ejecutar los
programas, estos cuentan con una memoria base de 1 a 8 MB, lo cual por si solo es muy
poco, pero por medio de la memoria dinámica se puede solicitar la memoria que se requiera
para nuestros programas. Esta memoria cuenta con características fundamentales como
que se puede solicitar más memoria en el momento que se requiera y haciendo uso de esto
se puede expandir el tamaño de arreglos, pero de la misma forma en el momento que no
se utilice se tiene que devolver la memoria, sino podría existir una fuga de memoria en
nuestro programa.
Desarrollo
Programa 1: Suma Puntero
Este primer programa debe solicitar al usuario dos números y devolver la suma de estos con
el uso de punteros, existen muchas formas de hacer esta tarea por como funcionan los
apuntadores, pero en este caso se creará una variable de tipo puntero que apunte a la
dirección de memoria donde se guarde la variable suma. Esta variable contendrá la suma
de los dos dígitos ingresados, ahora esto significa que si se hace una desreferencia del
apuntador mostrará el valor de suma, por lo que haciendo uso de esto se puede escribir el
siguiente código. Una desreferencia en un puntero significa que mostrará el valor donde
está apuntando.
Programa 2: Suma Por Referencia
Este programa debe realizar la misma tarea que el programa anterior, con la diferencia de
que debe ser por paso por referencia. Una función paso por referencia significa que, si una
variable utilizada en la función es modificada, también se modificará su valor en el main.
Para hacer esto con apuntadores, se tiene que pasar la dirección de memoria de la variable
que queremos modificar a la función, esta función lo tomará como un apuntador y de esta
forma si se modifica el valor dentro de la función, se modificará el valor al que apunta el
puntero, que representa la variable original.
Programa 3: Arreglo y Punteros
Este programa debe solicitar un arreglo de tamaño n, ingresado por el usuario y sus valores
y mostrarlo con el uso de punteros. Para esto se debe recordar que un arreglo se comporta
muy similar a un apuntador, por lo que los arreglos se pueden mostrar perfectamente solo
con un cambio de notación de arreglo a notación de puntero. Primero se declara un arreglo
y un puntero de enteros, el puntero se iguala al arreglo, después de ingresar los valores del
arreglo, para mostrarlo con puntero se utiliza la desreferencia, pero si solo se desreferencia
el puntero mostrará un valor y no cambiará, pero si se le suma 1, el puntero se moverá un
la cantidad de espacios que represente el tipo de variable, en este caso 4 por ser entero y
gracias a que los arreglos se declaran seguidos en la memoria de la computadora entonces
haciendo uso de esto se puede mostrar el arreglo con la siguiente función.
Programa 4: Número más Grande
El programa, al igual que el anterior, solicitará un arreglo tamaño n y solicitará los números
del arreglo y devolverá el número más grande con el uso de memoria dinámica. Al momento
de utilizar memoria dinámica, se puede declarar un arreglo como un apuntador sin
necesidad de hacer uso de la nomenclatura de arreglos. Para solicitar memoria dinámica se
utiliza la función malloc, esta función libera el tamaño que se solicite de memoria, pero se
tiene que registrar donde se guarda esta memoria y también el tipo de variable que se
utilizará en esa memoria dinámica para saber cuánta memoria debe liberar.
Para la función de mostrar el número mayor no se
modificará el arreglo por lo que no se requiere paso
por referencia, la función por medio de una variable
auxiliar guardará el valor mayor y seguirá hasta que
complete el tamaño del arreglo utilizando la
nomenclatura de apuntadores. Por último,
devolverá el valor del número mayor.
Al final del programa se debe usar la función free() y
el colocar el arreglo, para liberar la memoria
dinámica.
Programa 5: Número Vocales y Consonantes
El programa debe solicitar una cadena de texto y mostrar la cantidad de vocales y
consonantes que hay en la cadena con uso de apuntadores. Para buscar las vocales se hace
uso de la función strchr( ), se encuentra en la
biblioteca string.h, la función encuentra la
primera aparición de un carácter en una cadena,
por lo que se buscará en una cadena que
contenga todas las vocales, tanto en mayúsculas
como en minúsculas y se comenzará a buscar
con todos los caracteres de la cadena ingresada
por el usuario por medio de punteros de la
siguiente forma.
Ahora para la función que busque consonantes se hará de forma similar, pero ahora se tiene
que poner una restricción anterior a la búsqueda con strchr( ) para asegurar que sea una
letra y después negar la pregunta de igualdad, de esta forma solo aumentará el contador si
es una consonante.
Programa 6: Ordenar Arreglo
Este programa debe solicitar un el tamaño de un arreglo y generar sus valores con números
pseudoaleatorios entre -1000 y 1000 y posteriormente ordenar el arreglo de forma
ascendente utilizando apuntadores y memoria dinámica. Primero se debe hacer una
función para declarar el arreglo con los valores solicitados, en este caso se debe utilizar paso
por referencia ya que se requiere modificar la variable original para guardar los valores
generados.
Debe solicitar el tamaño del arreglo para
solicitar el tamaño de la memoria
dinámica y la dirección de memoria del
puntero para que sea paso por referencia
y para generar los valores deseados, se
debe utilizar el operador módulo con
2001 y restarle 1000.
Posteriormente para ordenar el arreglo igualmente se requiere hacer uso del paso por
referencia, se ordena por medio del método de la burbuja, pero con una notación de
apuntadores como se muestra en la imagen.
Programa 7: Suma Arreglo
Este programa solicita un arreglo de tamaño n y
muestra la suma de los valores con el uso de
apuntadores. Para declarar el arreglo se utiliza
una función similar a la del programa anterior,
pero con la diferencia de que los valores los
debe ingresar el usuario y solicita la memoria del
tamaño del arreglo.
Después
se debe crear una función que devuelva el valor de
la suma de todos los números del arreglo, por lo que
no se requiere modificar el arreglo original, así que
se hace uso del paso por valor, la función solo
solicitará el tamaño del arreglo y con una variable
auxiliar inicializada en cero se sumarán todos los
valores de la función.
Programa 8: Cadena de Texto
El programa debe solicitar al usuario una cadena de texto del tamaño que desee y que
concluya con un punto, posteriormente debe mostrar la cadena al usuario. Para llevar a
cabo esto se hará uso de la memoria dinámica, de esta forma se puede hacer crecer el
arreglo conforme crece carácter a carácter. Lo primero que se hace es con base a la función
mostrada en el documento, modificarlo para que la memoria dinámica crezca conforma se
colocan caracteres.
Primero se asigna un valor de
memoria equivalente a un entero,
para ingresar el primer valor,
posteriormente si es un punto el
programa saldrá de la función,
pero en caso de no ser un punto
aumentará el tamaño de memoria
con un realloc y un contador.
Una vez que el usuario coloque un
punto, se debe limpiar pantalla con
uso de la biblioteca “tools.h”, y
mostrar el arreglo con un for. Por
hacer uso de una biblioteca de
funciones no estandarizada se debe compilar con un makefile.
Resultados
Programa 1: Suma Puntero
El programa solicita dos números al usuario y muestra su suma haciendo uso de punteros,
el programa terminado se ve así:
Ejemplo:
Programa 2: Suma Por Referencia
Este programa visualmente se ve igual que el anterior y realiza la misma labor, solo que este
utiliza una función que hace uso del paso por referencia, lo que significa que modifica la
variable original de suma en el main, el programa se ve así:
Ejemplos:
Programa 3: Arreglo y Punteros
El usuario debe ingresar el tamaño de un arreglo y posteriormente ingresar los números,
por medio de un puntero se mostrará el arreglo, el programa concluido se ve así:
Ejemplo:
Programa 4: Número más Grande
El usuario deberá proporcionar el tamaño de números de un arreglo y escribir los números,
posteriormente el programa mostrará el número más grande, el programa se ve así:
Ejemplo:
Programa 5: Número Vocales y Consonantes
Este programa solicita una cadena de texto al usuario, una vez ingresada muestra la
cantidad de vocales y de consonantes respectivamente al usuario, el programa se ve asi:
Ejemplo:
Programa 6: Ordenar Arreglo
El programa solicita el tamaño de un arreglo y genera números aleatorios con valores
entre -1000 y 1000, posteriormente muestra el arreglo ordenado por el método de la
burbuja, el programa se ve asi:
Ejemplos:
Programa 7: Suma Arreglo
Este programa solicita el tamaño de un arreglo y posteriormente que se ingresen los
números del arreglo, después muestra la suma de los valores de este arreglo. El programa
concluido se ve asi:
Ejemplo:
Programa 8: Cadena de Texto
El programa solicita al usuario una cadena de texto del tamaño que desee y que concluya
con un punto, después el programa limpia pantalla y muestra el texto del usuario. EL
progeama se ve asi con su makefile:
Ejemplos:
}
Conclusión
Los punteros en lenguaje C permiten realizar muchas funciones, permitiendo manipular
variables de manera más extensa que con los arreglos, ya que estos incluso se pueden
modificar en tamaño, se puede usar para hacer paso por valor o por referencia y permiten
hacer uso de la memoria dinámica, el único inconveniente es que el tamaño de una variable
tipo puntero es incluso mayor que la de un entero, por lo que no son “ahorradoras” en
cuestión de espacio de memoria, pero por los beneficios que presentan, en muchas
ocasiones es mejor utilizarlos antes que los arreglos.
La memoria dinámica permite, no solo hacer programas más extensos y con un mayor
número de repetición en funciones, sino que también proporciona características
especiales que no se puede hacer con la memoria de Stack, hacer crecer los arreglos por
medio de una función, si se solicita mayor número de memoria se dará y hará crecer un
arreglo por medio de apuntadores.