SlideShare una empresa de Scribd logo
Implementación
de punteros
Programacion I
Los punteros en C++ (o apuntadores) son quizá uno de los temas que más
confusión causan al momento de aprender a programar en C++, sin
embargo verás que no es para tanto y que todo depende de dos
elementos: el signo & (ampersand) y el * (asterisco) que los explicaré en
breve. Durante este artículo verás entonces que no es para nada difícil
hacer y usar punteros y que además son de gran ayuda al momento de
necesitar valores y estructuras dinámicas, por ejemplo, para crear un array
dinámico, con dinámico me refiero a que su tamaño puede ser establecido
en tiempo de ejecución y lo mismo se puede hacer con las matrices (que
en realidad son un array multidimensional).
Muy bien para comenzar veamos un pequeño ejemplo y luego su
correspondiente explicación, una excelente forma de aprender. No te
preocupes de entender todo con este primer ejemplo, pues durante el
resto del artículo explicaré cada componente, su sintaxis y el final, cómo
aprovechar dichas funcionalidades para nuestro beneficio junto con algún
ejercicio.
Ejemplo de punteros
int variable; //Creamos un entero
int * apuntador = &variable;//Creamos una apuntador a la posición en
memoria de "variable"
*apuntador = 20; //Le asignamos un valor a esa posición de memoria.
delete [] apuntador; //Después de operar con punteros es necesario liberar
la memoria.
puntero = NULL;
Muy bien, ya hemos creado y usado nuestro primer puntero ¿Notaste el
uso del asterisco y del ampersand? espero que sí y además de eso hay
otros detalles que debemos considerar, veamos:
2
Para saber mas del tema ver el siguiente video:
https://www.youtube.com/watch?v=WhShnhovTHg
Detalles al crear y usar punteros en C++
El tipo de dato del apuntador debe coincidir con el de la variable
cuya posición en memoria apuntan. En el ejemplo vemos que
tanto variable como apuntador son enteros.
Siempre que queremos usar el apuntador debemos anteponer el
asterisco (*) para indicar que usaremos el valor en la posición de
memoria apuntada.
De no usar el asterisco el comportamiento sería impredecible.
Estaremos haciendo uso de la dirección de memoria más no del
valor almacenado en ésta.
Después de usar un puntero, especialmente si trabajamos con
arreglos o matrices, es MUY recomendable liberar la memoria
utilizada con la función delete (tal como en el ejemplo)
Un puntero o apuntador puede ser de cualquier tipo de dato,
inclusive los podemos usar con tipos complejos.
Ya que sabemos algunos trucos y detalles sobre los apuntadores en
C++, vamos a definir formalmente la utilidad del operador & y del
asterisco.
3
Los punteros y el ampersand
El ampersand es un operador de C++ y es comúnmente utilizado
para los punteros. Este operador nos permite obtener la dirección de
memoria de una variable cualquiera y es justo esto (la dirección en
memoria) lo que utilizan los punteros para referenciar valores.
Para saber mas del tema ver el siguiente video:
https://www.youtube.com/watch?v=Z1t8ByZvQMY
Los apuntadores y el asterisco
4
El asterisco es, por decirlo de alguna forma, el operador por excelencia de
los punteros. SU utilidad radica en que si el valor de dicho apuntador
corresponde a una dirección de memoria, el asterisco nos permite
resolverla y acceder al valor almacenado allí. Viéndolo desde otro
enfoque, un apuntador es únicamente una dirección de memoria (un
número) y el asterisco es el que hace la magia de obtener el valor
referenciado por dicha dirección.
Veamos otro ejemplo con cada elemento detallado paso a paso
Ejemplo de apuntadores
char *apuntador = NULL; //Declaramos un puntero
//Es recomendable inicializar un puntero en null, para detectar errores
fácilmente
char letra; //Declaramos una variable primitiva
apuntador = &letra; //Asignamos al apuntador la dirección de memoria de
la variable primitiva
*apuntador = 'x'; //Modificamos la variable a través del apuntador
cout << letra; //Muestra x por pantalla
En este ejemplo vemos que podemos usar cualquier tipo de dato, que un
puntero se puede inicializar independientemente y luego se le puede
asignar su referencia correspondiente. Nótese que al asignar (línea 6) no
utilizamos el asterisco, pues estamos definiendo la dirección de memoria
y no el valor en dicha dirección (recuerda que el * resuelve la dirección de
memoria y no es lo que requerimos en esa línea).
Ahora que hemos visto los ejemplos y tenemos claro el uso del ampersand
y el asterisco podemos entonces realizar algunos ejercicios interesantes.
Ejercicios con punteros en C++
5
Parámetros por referencia
Usualmente al enviar un parámetro a una función todo lo que se haga con
dicho parámetro allí adentro NO tiene efecto por fuera. Por ejemplo si a
una función la se le envía una variable cuyo valor es diez y al interior de la
función le sumamos un cinco, después de la ejecución de la función el
valor de la variable seguirá siendo diez en vez de quince. Lo que pasó al
interior de la función se quedó allí. Para solucionar esto, si queremos que
el valor cambie definitivamente, usamos punteros para pasar no el valor
del parámetro sino una referencia a éste (paso por referencia). Veamos:
#include "iostream"
#include "stdio.h"
using namespace std;
int funcion(int valor)
{
valor = valor + 10; //Se le suma 10
return valor;
}
int funcionPunteros(int* valor)
{
*valor = *valor + 10; //Se le suma 10 a la posición en memoria
return *valor;
}
int main()
{
int numero = 10;
cout << "Antes de funcion " << numero << "n"; //10
funcion(numero); //Se pasa por valor
cout << "Despues de funcion " << numero << "n"; //10
cout << "Antes de funcionPunteros " << numero << "n"; //10
funcionPunteros(&numero); //Se envía la dirección de memoria y la
función resuelve la referencia
cout << "Despues de funcionPunteros " << numero << "n"; //20 (10+10)
system("pause");
return 0;
}
Como podrás comprobar si ejecutas el código del ejercicio al llamar a
"funcion" sólo enviamos el valor y por ende éste no es modificado por
fuera de la función, con "funcionPunteros" estamos manipulando la
posición en memoria del parámetro recibido (por eso usamos el *) y por
ende al ejecutarla el valor de la variable se modifica. De ese modo ya
hicimos el primer ejercicio con punteros en C++ y ya comprendemos el
paso por referencia.
Array dinámico
Como mencioné al comienzo del artículo, por medio de apuntadores
podemos crear arreglos o vectores dinámicos, es decir, un array al cual se
le define su tamaño o capacidad durante la ejecución del código y no
antes, lo cual nos permite definirle el tamaño deseado por el usuario.
Para este ejercicio retomaré el ejemplo del artículo de arreglos o vectores:
Queremos crear un programa con el cual podamos guardar los títulos y los
autores de diferentes libros sin perder ninguno de ellos. El usuario es el
encargado de suministrar la información de cada libro. En esta ocasión ya
sabemos usar punteros, así que será también el usuario quien nos diga
cuántos libros desea ingresar, ya no necesitamos suponer que sólo
ingresará 5 libros. Veamos:
6
7
#include "iostream"
#include "stdio.h"
#include "string"
using namespace std;
int main()
{
string* titulos = NULL; //Se inicializa el puntero (inicia en null)
string* autores = NULL; //Se inicializa el puntero (inicia en null)
int tamanio ; //Se inicializa la variable
cout << "Cuantos libros desea ingresar?";
string entrada;
getline(cin, entrada); //Se asigna el valor ingresado
tamanio = stoi(entrada); //Se transforma la entrada en número
//Declaramos un arreglo del tamaño ingresado para los titulos
titulos = new string[tamanio];
//Declaramos un arreglo del tamaño ingresado para los autores
autores = new string[tamanio];
cout << "Por favor ingrese la siguiente información de los Libros: n";
for(int i = 0; i < tamanio; i++)
{
cout << "n******* Libro " << i + 1 << "********:n";
cout << "Titulo: ";
//cin >> titulos[i]; //No funciona con espacios
getline(cin, titulos[i]);
cout << "Autor: ";
//cin >> autores[i]; //No funciona con espacios
getline(cin, autores[i]);
}
//Liberamos la memoria de ambos punteros
delete [] titulos;
delete [] autores;
titulos = NULL;
autores = NULL;
system("pause");
return 0;
}
Así entonces tuvimos dos punteros, uno para todos los autores y otro para
todos los títulos. Haciendo uso de ellos pudimos definir la cantidad de
libros a ingresar por medio del usuario, es decir lo hicimos de manera
dinámica, en tiempo de ejecución.
Matrices dinámicas
Así como lo hicimos con los array, también podemos tener matrices
dinámicas y definir su tamaño, número de filas o número de columnas (o
las dos) según sea necesario.
Para esto tomaré el mismo ejemplo de los libros, pero usando una matriz,
en vez de dos vectores, tal y como se solucionó en la sección de matrices
veamos:
8
9
#include "iostream"
#include "stdio.h"
#include "string"
using namespace std;
int main()
{
int cols = 2; //El número de columnas es fijo (sólo título y autor)
string** libros; //Si inicializa la matriz (punteros de punteros)
int tamanio ; //Se inicializa la variable
cout << "Cuantos libros desea ingresar?";
string entrada;
getline(cin, entrada); //Se asigna el valor ingresado
tamanio = stoi(entrada); //Se transforma la entrada en número
libros = new string*[tamanio];//Se asigna el número de filas según el
usuario
cout << "Por favor ingrese la siguiente información de los Libros: n";
string titulo ,autor;
for(int i = 0; i < tamanio; i++)
{
libros[i] = new string[cols]; //Cada fila contendrá dos columnas
//Notar que cols pudo haber sido ingresada por el usuario también
cout << "n******* Libro " << i + 1 << "********:n";
cout << "Titulo: ";
getline(cin,titulo);
cout << "Autor: ";
getline(cin,autor);
libros[i][0] = titulo;
libros[i][1] = autor;
}
//Para liberar la memoria debemos recorrer fila por fila primero.
for (int i = 0; i < tamanio; ++i)
{
delete [] libros[i]; //Cada fila de libros es otro array de punteros
//Por eso son punteros a punteros
}
//Luego de limpiar las columnas, quitamos la fila única que quedó
delete [] libros;
system("pause");
return 0;
}
Este ejercicio es el perfecto para aclarar dudas o darse cuenta si realmente
comprendes el concepto de apuntadores y su aplicación para arrays
dinámicos. Debido a que la cantidad de columnas es fija, no se lo pedimos
al usuario, simplemente lo declaramos con valor dos. Luego tenemos el
puntero, pero no es un puntero cualquiera, al ser una matriz, será un
puntero que tendrá otros punteros adentro, por eso se usa doble asterisco,
luego se obtiene el tamaño del usuario (cantidad de libros) y al momento
de inicializar la fila estamos indicando que es un arreglo de punteros, por
eso se usa el * en la línea 23. Luego al interior del ciclo, cuando estamos
llenando la matriz, debemos indicar que cada fila estará compuesta por un
array de punteros de tamaño dos (dos columnas) y así construimos nuestra
matriz dinámica.
Debes notar también que la liberación de la memoria es un poco más
trabajosa, pues debemos ir fila por fila liberando la memoria de las
columnas creadas y luego liberar la fila completa. Ahí podrás notar la
diferencia en eficiencia y uso de memoria al usar arreglos o usar matrices.
Nota: La instrucción new utilizada con los strings es necesaria para
asignar el espacio en memoria para esa colección de elementos. No te
preocupes por ello de momento, solo asegúrate de usarla y ya el lenguaje
se hará cargo del resto.
10

Más contenido relacionado

La actualidad más candente

Gestión Dinámica de la Memoria
Gestión Dinámica de la MemoriaGestión Dinámica de la Memoria
Gestión Dinámica de la Memoria
Mago Julio Cesar
 
Lenguaje C para Administradores de Red - Script II Punteros
Lenguaje C para Administradores de Red - Script II PunterosLenguaje C para Administradores de Red - Script II Punteros
Lenguaje C para Administradores de Red - Script II Punteros
sirfids
 
Funciones str
Funciones strFunciones str
Funciones str
Sharliemaster
 
Apuntadores
Apuntadores Apuntadores
Apuntadores
Mariannis Ortega
 
Utp pti_s5_arreglos 2012-2
 Utp pti_s5_arreglos 2012-2 Utp pti_s5_arreglos 2012-2
Utp pti_s5_arreglos 2012-2jcbenitezp
 
Utp pti_s5_arreglos
 Utp pti_s5_arreglos Utp pti_s5_arreglos
Utp pti_s5_arreglosjcbenitezp
 
Strrev
StrrevStrrev
El lenguaje c
El lenguaje cEl lenguaje c
El lenguaje c
joeshego
 
Guia De Practica 3
Guia De Practica 3Guia De Practica 3
Guia De Practica 3louis
 
Strcmp
StrcmpStrcmp
Utp lpi_s5_arreglos 2012-2
 Utp lpi_s5_arreglos 2012-2 Utp lpi_s5_arreglos 2012-2
Utp lpi_s5_arreglos 2012-2jcbenitezp
 
Strlen
StrlenStrlen
06 - Arrays y matrices en lenguaje C
06 - Arrays y matrices en lenguaje C06 - Arrays y matrices en lenguaje C
06 - Arrays y matrices en lenguaje C
Diego Andrés Alvarez Marín
 
Punteros a Funciones en C
Punteros a Funciones en CPunteros a Funciones en C
Punteros a Funciones en C
AnesGy SD
 
Tema 8 www.fresymetal.com
Tema 8 www.fresymetal.comTema 8 www.fresymetal.com
Tema 8 www.fresymetal.com
FresyMetal
 
Introduccion a C++
Introduccion a C++Introduccion a C++
Introduccion a C++
LenHugo
 
arrays
arraysarrays

La actualidad más candente (20)

Gestión Dinámica de la Memoria
Gestión Dinámica de la MemoriaGestión Dinámica de la Memoria
Gestión Dinámica de la Memoria
 
Lenguaje C para Administradores de Red - Script II Punteros
Lenguaje C para Administradores de Red - Script II PunterosLenguaje C para Administradores de Red - Script II Punteros
Lenguaje C para Administradores de Red - Script II Punteros
 
Funciones str
Funciones strFunciones str
Funciones str
 
Apuntadores
Apuntadores Apuntadores
Apuntadores
 
Utp pti_s5_arreglos 2012-2
 Utp pti_s5_arreglos 2012-2 Utp pti_s5_arreglos 2012-2
Utp pti_s5_arreglos 2012-2
 
Utp pti_s5_arreglos
 Utp pti_s5_arreglos Utp pti_s5_arreglos
Utp pti_s5_arreglos
 
Strrev
StrrevStrrev
Strrev
 
El lenguaje c
El lenguaje cEl lenguaje c
El lenguaje c
 
Pe15 cadenacaracteres
Pe15 cadenacaracteresPe15 cadenacaracteres
Pe15 cadenacaracteres
 
Guia De Practica 3
Guia De Practica 3Guia De Practica 3
Guia De Practica 3
 
Mac
MacMac
Mac
 
Solucion ejercicios punteros cadenas-vectores
Solucion ejercicios punteros cadenas-vectoresSolucion ejercicios punteros cadenas-vectores
Solucion ejercicios punteros cadenas-vectores
 
Strcmp
StrcmpStrcmp
Strcmp
 
Utp lpi_s5_arreglos 2012-2
 Utp lpi_s5_arreglos 2012-2 Utp lpi_s5_arreglos 2012-2
Utp lpi_s5_arreglos 2012-2
 
Strlen
StrlenStrlen
Strlen
 
06 - Arrays y matrices en lenguaje C
06 - Arrays y matrices en lenguaje C06 - Arrays y matrices en lenguaje C
06 - Arrays y matrices en lenguaje C
 
Punteros a Funciones en C
Punteros a Funciones en CPunteros a Funciones en C
Punteros a Funciones en C
 
Tema 8 www.fresymetal.com
Tema 8 www.fresymetal.comTema 8 www.fresymetal.com
Tema 8 www.fresymetal.com
 
Introduccion a C++
Introduccion a C++Introduccion a C++
Introduccion a C++
 
arrays
arraysarrays
arrays
 

Similar a Implementacion de punteros

Programación en c (iii parte)
Programación en c (iii parte)Programación en c (iii parte)
Programación en c (iii parte)
MarielaCuriel
 
Apuntadorkeurjeh4jj4by un 4hh4j4u4jj4h4y4jh4
Apuntadorkeurjeh4jj4by un 4hh4j4u4jj4h4y4jh4Apuntadorkeurjeh4jj4by un 4hh4j4u4jj4h4y4jh4
Apuntadorkeurjeh4jj4by un 4hh4j4u4jj4h4y4jh4
hassanbadredun
 
Tipos de datos en C
Tipos de datos en CTipos de datos en C
Tipos de datos en C
McGuix Bermeo
 
Punteros y elementos dinámicos en c++
Punteros y elementos dinámicos en c++Punteros y elementos dinámicos en c++
Punteros y elementos dinámicos en c++
Tensor
 
Apuntadores
ApuntadoresApuntadores
Apuntadoresluisabn
 
nodo
nodonodo
Administración de memoria y apuntadores
Administración de memoria y apuntadoresAdministración de memoria y apuntadores
Administración de memoria y apuntadores
Franklin Chavez
 
Apuntadores y direccionamiento
Apuntadores y direccionamientoApuntadores y direccionamiento
Apuntadores y direccionamiento
Sergio Ramos
 
Algoritmos y lenjuage de programacion
Algoritmos y  lenjuage de programacionAlgoritmos y  lenjuage de programacion
Algoritmos y lenjuage de programacionYsaac Ruiz
 
Estructura de Datos
Estructura de DatosEstructura de Datos
Estructura de Datos
luna_72
 
Lenguajec diapositivas
Lenguajec diapositivasLenguajec diapositivas
Lenguajec diapositivas
tacubomx
 
Lenguajec 1
Lenguajec 1Lenguajec 1
Lenguajec 1joeshego
 
Presentación de c #
Presentación de c #Presentación de c #
Presentación de c #
César Gimenez
 
Lenguaje De ProgramacióN Basic
Lenguaje De ProgramacióN BasicLenguaje De ProgramacióN Basic
Lenguaje De ProgramacióN BasicRokr02
 
Apuntadores y listas
Apuntadores y listasApuntadores y listas
Apuntadores y listas
Marialix Quintero
 
Programacion C#
Programacion C#Programacion C#
Programacion C#
Andrew King
 

Similar a Implementacion de punteros (20)

Programación en c (iii parte)
Programación en c (iii parte)Programación en c (iii parte)
Programación en c (iii parte)
 
Apuntadorkeurjeh4jj4by un 4hh4j4u4jj4h4y4jh4
Apuntadorkeurjeh4jj4by un 4hh4j4u4jj4h4y4jh4Apuntadorkeurjeh4jj4by un 4hh4j4u4jj4h4y4jh4
Apuntadorkeurjeh4jj4by un 4hh4j4u4jj4h4y4jh4
 
Tipos de datos en C
Tipos de datos en CTipos de datos en C
Tipos de datos en C
 
Punteros y elementos dinámicos en c++
Punteros y elementos dinámicos en c++Punteros y elementos dinámicos en c++
Punteros y elementos dinámicos en c++
 
Apuntadores
ApuntadoresApuntadores
Apuntadores
 
nodo
nodonodo
nodo
 
Administración de memoria y apuntadores
Administración de memoria y apuntadoresAdministración de memoria y apuntadores
Administración de memoria y apuntadores
 
Apuntadores y direccionamiento
Apuntadores y direccionamientoApuntadores y direccionamiento
Apuntadores y direccionamiento
 
Algoritmos y lenjuage de programacion
Algoritmos y  lenjuage de programacionAlgoritmos y  lenjuage de programacion
Algoritmos y lenjuage de programacion
 
Apunfun1
Apunfun1Apunfun1
Apunfun1
 
C sharp intro0
C sharp intro0C sharp intro0
C sharp intro0
 
Java básico
Java  básicoJava  básico
Java básico
 
Estructura de Datos
Estructura de DatosEstructura de Datos
Estructura de Datos
 
Lenguajec diapositivas
Lenguajec diapositivasLenguajec diapositivas
Lenguajec diapositivas
 
Lenguajec 1
Lenguajec 1Lenguajec 1
Lenguajec 1
 
Presentación de c #
Presentación de c #Presentación de c #
Presentación de c #
 
Modelo Simulado
Modelo SimuladoModelo Simulado
Modelo Simulado
 
Lenguaje De ProgramacióN Basic
Lenguaje De ProgramacióN BasicLenguaje De ProgramacióN Basic
Lenguaje De ProgramacióN Basic
 
Apuntadores y listas
Apuntadores y listasApuntadores y listas
Apuntadores y listas
 
Programacion C#
Programacion C#Programacion C#
Programacion C#
 

Más de KareliaRivas

Lenguaje de programación Python
Lenguaje de programación PythonLenguaje de programación Python
Lenguaje de programación Python
KareliaRivas
 
Diseño e instalación de sitios web (PHP hypertext preprocessor)
Diseño e instalación de sitios web (PHP hypertext preprocessor)Diseño e instalación de sitios web (PHP hypertext preprocessor)
Diseño e instalación de sitios web (PHP hypertext preprocessor)
KareliaRivas
 
Estrategia de aprendizaje 17 (Herencia)
Estrategia de aprendizaje 17 (Herencia)Estrategia de aprendizaje 17 (Herencia)
Estrategia de aprendizaje 17 (Herencia)
KareliaRivas
 
Programación orientada a objetos (Herencia)
Programación orientada a objetos (Herencia)Programación orientada a objetos (Herencia)
Programación orientada a objetos (Herencia)
KareliaRivas
 
Estrategia de aprendizaje 16 (Introducción a html)
Estrategia de aprendizaje 16 (Introducción a html)Estrategia de aprendizaje 16 (Introducción a html)
Estrategia de aprendizaje 16 (Introducción a html)
KareliaRivas
 
C#
C#C#
Introducción a HTML
Introducción a HTMLIntroducción a HTML
Introducción a HTML
KareliaRivas
 
Programación orientada a objetos (Crear objetos)
Programación orientada a objetos (Crear objetos)Programación orientada a objetos (Crear objetos)
Programación orientada a objetos (Crear objetos)
KareliaRivas
 
Java
JavaJava
Html
HtmlHtml
Programación orientada a objetos (Creación de clases)
Programación orientada a objetos (Creación de clases)Programación orientada a objetos (Creación de clases)
Programación orientada a objetos (Creación de clases)
KareliaRivas
 
Los tipos de lenguaje de programación
Los tipos de lenguaje de programaciónLos tipos de lenguaje de programación
Los tipos de lenguaje de programación
KareliaRivas
 
Diseño e instalación de sitios web (Apache HTTP server)
Diseño e instalación de sitios web (Apache HTTP server)Diseño e instalación de sitios web (Apache HTTP server)
Diseño e instalación de sitios web (Apache HTTP server)
KareliaRivas
 
Introducción a la programación orientada a objetos en c (POO)
Introducción a la programación orientada a objetos en c (POO)Introducción a la programación orientada a objetos en c (POO)
Introducción a la programación orientada a objetos en c (POO)
KareliaRivas
 
Lenguajes de programación
Lenguajes de programaciónLenguajes de programación
Lenguajes de programación
KareliaRivas
 
Diseño e instalación de sitios web (Definición de un servidor web)
Diseño e instalación de sitios web (Definición de un servidor web)Diseño e instalación de sitios web (Definición de un servidor web)
Diseño e instalación de sitios web (Definición de un servidor web)
KareliaRivas
 
Factorial en C++
Factorial en C++Factorial en C++
Factorial en C++
KareliaRivas
 
Interfaces para sistemas de gestión de bases de datos
Interfaces para sistemas de gestión de bases de datosInterfaces para sistemas de gestión de bases de datos
Interfaces para sistemas de gestión de bases de datos
KareliaRivas
 
Recursividad en programación
Recursividad en programaciónRecursividad en programación
Recursividad en programación
KareliaRivas
 
Diseño e instalación de sitios web (El reto del espacio en pantalla / plantil...
Diseño e instalación de sitios web (El reto del espacio en pantalla / plantil...Diseño e instalación de sitios web (El reto del espacio en pantalla / plantil...
Diseño e instalación de sitios web (El reto del espacio en pantalla / plantil...
KareliaRivas
 

Más de KareliaRivas (20)

Lenguaje de programación Python
Lenguaje de programación PythonLenguaje de programación Python
Lenguaje de programación Python
 
Diseño e instalación de sitios web (PHP hypertext preprocessor)
Diseño e instalación de sitios web (PHP hypertext preprocessor)Diseño e instalación de sitios web (PHP hypertext preprocessor)
Diseño e instalación de sitios web (PHP hypertext preprocessor)
 
Estrategia de aprendizaje 17 (Herencia)
Estrategia de aprendizaje 17 (Herencia)Estrategia de aprendizaje 17 (Herencia)
Estrategia de aprendizaje 17 (Herencia)
 
Programación orientada a objetos (Herencia)
Programación orientada a objetos (Herencia)Programación orientada a objetos (Herencia)
Programación orientada a objetos (Herencia)
 
Estrategia de aprendizaje 16 (Introducción a html)
Estrategia de aprendizaje 16 (Introducción a html)Estrategia de aprendizaje 16 (Introducción a html)
Estrategia de aprendizaje 16 (Introducción a html)
 
C#
C#C#
C#
 
Introducción a HTML
Introducción a HTMLIntroducción a HTML
Introducción a HTML
 
Programación orientada a objetos (Crear objetos)
Programación orientada a objetos (Crear objetos)Programación orientada a objetos (Crear objetos)
Programación orientada a objetos (Crear objetos)
 
Java
JavaJava
Java
 
Html
HtmlHtml
Html
 
Programación orientada a objetos (Creación de clases)
Programación orientada a objetos (Creación de clases)Programación orientada a objetos (Creación de clases)
Programación orientada a objetos (Creación de clases)
 
Los tipos de lenguaje de programación
Los tipos de lenguaje de programaciónLos tipos de lenguaje de programación
Los tipos de lenguaje de programación
 
Diseño e instalación de sitios web (Apache HTTP server)
Diseño e instalación de sitios web (Apache HTTP server)Diseño e instalación de sitios web (Apache HTTP server)
Diseño e instalación de sitios web (Apache HTTP server)
 
Introducción a la programación orientada a objetos en c (POO)
Introducción a la programación orientada a objetos en c (POO)Introducción a la programación orientada a objetos en c (POO)
Introducción a la programación orientada a objetos en c (POO)
 
Lenguajes de programación
Lenguajes de programaciónLenguajes de programación
Lenguajes de programación
 
Diseño e instalación de sitios web (Definición de un servidor web)
Diseño e instalación de sitios web (Definición de un servidor web)Diseño e instalación de sitios web (Definición de un servidor web)
Diseño e instalación de sitios web (Definición de un servidor web)
 
Factorial en C++
Factorial en C++Factorial en C++
Factorial en C++
 
Interfaces para sistemas de gestión de bases de datos
Interfaces para sistemas de gestión de bases de datosInterfaces para sistemas de gestión de bases de datos
Interfaces para sistemas de gestión de bases de datos
 
Recursividad en programación
Recursividad en programaciónRecursividad en programación
Recursividad en programación
 
Diseño e instalación de sitios web (El reto del espacio en pantalla / plantil...
Diseño e instalación de sitios web (El reto del espacio en pantalla / plantil...Diseño e instalación de sitios web (El reto del espacio en pantalla / plantil...
Diseño e instalación de sitios web (El reto del espacio en pantalla / plantil...
 

Último

Desarrollo de Habilidades de Pensamiento.
Desarrollo de Habilidades de Pensamiento.Desarrollo de Habilidades de Pensamiento.
Desarrollo de Habilidades de Pensamiento.
AlejandraCasallas7
 
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdfDESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
marianabz2403
 
Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5
JulyMuoz18
 
Estructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdfEstructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdf
cristianrb0324
 
Posnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativaPosnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativa
Fernando Villares
 
Estructuras básicas_ conceptos básicos de programación.pdf
Estructuras básicas_  conceptos básicos de programación.pdfEstructuras básicas_  conceptos básicos de programación.pdf
Estructuras básicas_ conceptos básicos de programación.pdf
ItsSofi
 
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdfEstructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
IsabellaRubio6
 
Inteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdfInteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdf
Emilio Casbas
 
Diagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestreDiagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestre
DiegoCampos433849
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
jjfch3110
 
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdfTRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
thomasdcroz38
 
Estructuras básicas_ conceptos de programación (1).docx
Estructuras básicas_ conceptos de programación  (1).docxEstructuras básicas_ conceptos de programación  (1).docx
Estructuras básicas_ conceptos de programación (1).docx
SamuelRamirez83524
 
proyecto invernadero desde el departamento de tecnología para Erasmus
proyecto invernadero desde el departamento de tecnología para Erasmusproyecto invernadero desde el departamento de tecnología para Erasmus
proyecto invernadero desde el departamento de tecnología para Erasmus
raquelariza02
 
3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto
cdraco
 
Conceptos Básicos de Programación. Tecnología
Conceptos Básicos de Programación. TecnologíaConceptos Básicos de Programación. Tecnología
Conceptos Básicos de Programación. Tecnología
coloradxmaria
 
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Telefónica
 
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTALINFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
CrystalRomero18
 
trabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6ftrabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6f
zoecaicedosalazar
 
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
DanielErazoMedina
 
Conceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación ProyectoConceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación Proyecto
cofferub
 

Último (20)

Desarrollo de Habilidades de Pensamiento.
Desarrollo de Habilidades de Pensamiento.Desarrollo de Habilidades de Pensamiento.
Desarrollo de Habilidades de Pensamiento.
 
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdfDESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
DESARROLO DE HABILIDADES DE PENSAMIENTO.pdf
 
Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5Conceptos Básicos de Programación L.D 10-5
Conceptos Básicos de Programación L.D 10-5
 
Estructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdfEstructuras Básicas_Tecnología_Grado10-7.pdf
Estructuras Básicas_Tecnología_Grado10-7.pdf
 
Posnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativaPosnarrativas en la era de la IA generativa
Posnarrativas en la era de la IA generativa
 
Estructuras básicas_ conceptos básicos de programación.pdf
Estructuras básicas_  conceptos básicos de programación.pdfEstructuras básicas_  conceptos básicos de programación.pdf
Estructuras básicas_ conceptos básicos de programación.pdf
 
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdfEstructuras Básicas_ Conceptos Basicos De Programacion.pdf
Estructuras Básicas_ Conceptos Basicos De Programacion.pdf
 
Inteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdfInteligencia Artificial y Ciberseguridad.pdf
Inteligencia Artificial y Ciberseguridad.pdf
 
Diagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestreDiagrama de flujo - ingenieria de sistemas 5to semestre
Diagrama de flujo - ingenieria de sistemas 5to semestre
 
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdfTrabajo Coding For kids 1 y 2 grado 9-4.pdf
Trabajo Coding For kids 1 y 2 grado 9-4.pdf
 
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdfTRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
TRABAJO DESARROLLO DE HABILIDADES DE PENSAMIENTO.pdf
 
Estructuras básicas_ conceptos de programación (1).docx
Estructuras básicas_ conceptos de programación  (1).docxEstructuras básicas_ conceptos de programación  (1).docx
Estructuras básicas_ conceptos de programación (1).docx
 
proyecto invernadero desde el departamento de tecnología para Erasmus
proyecto invernadero desde el departamento de tecnología para Erasmusproyecto invernadero desde el departamento de tecnología para Erasmus
proyecto invernadero desde el departamento de tecnología para Erasmus
 
3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto3Redu: Responsabilidad, Resiliencia y Respeto
3Redu: Responsabilidad, Resiliencia y Respeto
 
Conceptos Básicos de Programación. Tecnología
Conceptos Básicos de Programación. TecnologíaConceptos Básicos de Programación. Tecnología
Conceptos Básicos de Programación. Tecnología
 
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
Índice del libro "Big Data: Tecnologías para arquitecturas Data-Centric" de 0...
 
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTALINFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
INFORME DE LAS FICHAS.docx.pdf LICEO DEPARTAMENTAL
 
trabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6ftrabajo de tecnologia, segundo periodo 9-6f
trabajo de tecnologia, segundo periodo 9-6f
 
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
ACTIVIDAD DE TECNOLOGÍA AÑO LECTIVO 2024
 
Conceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación ProyectoConceptos Básicos de Programación Proyecto
Conceptos Básicos de Programación Proyecto
 

Implementacion de punteros

  • 2. Los punteros en C++ (o apuntadores) son quizá uno de los temas que más confusión causan al momento de aprender a programar en C++, sin embargo verás que no es para tanto y que todo depende de dos elementos: el signo & (ampersand) y el * (asterisco) que los explicaré en breve. Durante este artículo verás entonces que no es para nada difícil hacer y usar punteros y que además son de gran ayuda al momento de necesitar valores y estructuras dinámicas, por ejemplo, para crear un array dinámico, con dinámico me refiero a que su tamaño puede ser establecido en tiempo de ejecución y lo mismo se puede hacer con las matrices (que en realidad son un array multidimensional). Muy bien para comenzar veamos un pequeño ejemplo y luego su correspondiente explicación, una excelente forma de aprender. No te preocupes de entender todo con este primer ejemplo, pues durante el resto del artículo explicaré cada componente, su sintaxis y el final, cómo aprovechar dichas funcionalidades para nuestro beneficio junto con algún ejercicio. Ejemplo de punteros int variable; //Creamos un entero int * apuntador = &variable;//Creamos una apuntador a la posición en memoria de "variable" *apuntador = 20; //Le asignamos un valor a esa posición de memoria. delete [] apuntador; //Después de operar con punteros es necesario liberar la memoria. puntero = NULL; Muy bien, ya hemos creado y usado nuestro primer puntero ¿Notaste el uso del asterisco y del ampersand? espero que sí y además de eso hay otros detalles que debemos considerar, veamos: 2 Para saber mas del tema ver el siguiente video: https://www.youtube.com/watch?v=WhShnhovTHg
  • 3. Detalles al crear y usar punteros en C++ El tipo de dato del apuntador debe coincidir con el de la variable cuya posición en memoria apuntan. En el ejemplo vemos que tanto variable como apuntador son enteros. Siempre que queremos usar el apuntador debemos anteponer el asterisco (*) para indicar que usaremos el valor en la posición de memoria apuntada. De no usar el asterisco el comportamiento sería impredecible. Estaremos haciendo uso de la dirección de memoria más no del valor almacenado en ésta. Después de usar un puntero, especialmente si trabajamos con arreglos o matrices, es MUY recomendable liberar la memoria utilizada con la función delete (tal como en el ejemplo) Un puntero o apuntador puede ser de cualquier tipo de dato, inclusive los podemos usar con tipos complejos. Ya que sabemos algunos trucos y detalles sobre los apuntadores en C++, vamos a definir formalmente la utilidad del operador & y del asterisco. 3 Los punteros y el ampersand El ampersand es un operador de C++ y es comúnmente utilizado para los punteros. Este operador nos permite obtener la dirección de memoria de una variable cualquiera y es justo esto (la dirección en memoria) lo que utilizan los punteros para referenciar valores. Para saber mas del tema ver el siguiente video: https://www.youtube.com/watch?v=Z1t8ByZvQMY
  • 4. Los apuntadores y el asterisco 4 El asterisco es, por decirlo de alguna forma, el operador por excelencia de los punteros. SU utilidad radica en que si el valor de dicho apuntador corresponde a una dirección de memoria, el asterisco nos permite resolverla y acceder al valor almacenado allí. Viéndolo desde otro enfoque, un apuntador es únicamente una dirección de memoria (un número) y el asterisco es el que hace la magia de obtener el valor referenciado por dicha dirección. Veamos otro ejemplo con cada elemento detallado paso a paso Ejemplo de apuntadores char *apuntador = NULL; //Declaramos un puntero //Es recomendable inicializar un puntero en null, para detectar errores fácilmente char letra; //Declaramos una variable primitiva apuntador = &letra; //Asignamos al apuntador la dirección de memoria de la variable primitiva *apuntador = 'x'; //Modificamos la variable a través del apuntador cout << letra; //Muestra x por pantalla En este ejemplo vemos que podemos usar cualquier tipo de dato, que un puntero se puede inicializar independientemente y luego se le puede asignar su referencia correspondiente. Nótese que al asignar (línea 6) no utilizamos el asterisco, pues estamos definiendo la dirección de memoria y no el valor en dicha dirección (recuerda que el * resuelve la dirección de memoria y no es lo que requerimos en esa línea). Ahora que hemos visto los ejemplos y tenemos claro el uso del ampersand y el asterisco podemos entonces realizar algunos ejercicios interesantes.
  • 5. Ejercicios con punteros en C++ 5 Parámetros por referencia Usualmente al enviar un parámetro a una función todo lo que se haga con dicho parámetro allí adentro NO tiene efecto por fuera. Por ejemplo si a una función la se le envía una variable cuyo valor es diez y al interior de la función le sumamos un cinco, después de la ejecución de la función el valor de la variable seguirá siendo diez en vez de quince. Lo que pasó al interior de la función se quedó allí. Para solucionar esto, si queremos que el valor cambie definitivamente, usamos punteros para pasar no el valor del parámetro sino una referencia a éste (paso por referencia). Veamos: #include "iostream" #include "stdio.h" using namespace std; int funcion(int valor) { valor = valor + 10; //Se le suma 10 return valor; } int funcionPunteros(int* valor) { *valor = *valor + 10; //Se le suma 10 a la posición en memoria return *valor; } int main() { int numero = 10; cout << "Antes de funcion " << numero << "n"; //10 funcion(numero); //Se pasa por valor cout << "Despues de funcion " << numero << "n"; //10 cout << "Antes de funcionPunteros " << numero << "n"; //10 funcionPunteros(&numero); //Se envía la dirección de memoria y la función resuelve la referencia cout << "Despues de funcionPunteros " << numero << "n"; //20 (10+10) system("pause"); return 0; }
  • 6. Como podrás comprobar si ejecutas el código del ejercicio al llamar a "funcion" sólo enviamos el valor y por ende éste no es modificado por fuera de la función, con "funcionPunteros" estamos manipulando la posición en memoria del parámetro recibido (por eso usamos el *) y por ende al ejecutarla el valor de la variable se modifica. De ese modo ya hicimos el primer ejercicio con punteros en C++ y ya comprendemos el paso por referencia. Array dinámico Como mencioné al comienzo del artículo, por medio de apuntadores podemos crear arreglos o vectores dinámicos, es decir, un array al cual se le define su tamaño o capacidad durante la ejecución del código y no antes, lo cual nos permite definirle el tamaño deseado por el usuario. Para este ejercicio retomaré el ejemplo del artículo de arreglos o vectores: Queremos crear un programa con el cual podamos guardar los títulos y los autores de diferentes libros sin perder ninguno de ellos. El usuario es el encargado de suministrar la información de cada libro. En esta ocasión ya sabemos usar punteros, así que será también el usuario quien nos diga cuántos libros desea ingresar, ya no necesitamos suponer que sólo ingresará 5 libros. Veamos: 6
  • 7. 7 #include "iostream" #include "stdio.h" #include "string" using namespace std; int main() { string* titulos = NULL; //Se inicializa el puntero (inicia en null) string* autores = NULL; //Se inicializa el puntero (inicia en null) int tamanio ; //Se inicializa la variable cout << "Cuantos libros desea ingresar?"; string entrada; getline(cin, entrada); //Se asigna el valor ingresado tamanio = stoi(entrada); //Se transforma la entrada en número //Declaramos un arreglo del tamaño ingresado para los titulos titulos = new string[tamanio]; //Declaramos un arreglo del tamaño ingresado para los autores autores = new string[tamanio]; cout << "Por favor ingrese la siguiente información de los Libros: n"; for(int i = 0; i < tamanio; i++) { cout << "n******* Libro " << i + 1 << "********:n"; cout << "Titulo: "; //cin >> titulos[i]; //No funciona con espacios getline(cin, titulos[i]); cout << "Autor: "; //cin >> autores[i]; //No funciona con espacios getline(cin, autores[i]); } //Liberamos la memoria de ambos punteros delete [] titulos; delete [] autores; titulos = NULL; autores = NULL; system("pause"); return 0; }
  • 8. Así entonces tuvimos dos punteros, uno para todos los autores y otro para todos los títulos. Haciendo uso de ellos pudimos definir la cantidad de libros a ingresar por medio del usuario, es decir lo hicimos de manera dinámica, en tiempo de ejecución. Matrices dinámicas Así como lo hicimos con los array, también podemos tener matrices dinámicas y definir su tamaño, número de filas o número de columnas (o las dos) según sea necesario. Para esto tomaré el mismo ejemplo de los libros, pero usando una matriz, en vez de dos vectores, tal y como se solucionó en la sección de matrices veamos: 8
  • 9. 9 #include "iostream" #include "stdio.h" #include "string" using namespace std; int main() { int cols = 2; //El número de columnas es fijo (sólo título y autor) string** libros; //Si inicializa la matriz (punteros de punteros) int tamanio ; //Se inicializa la variable cout << "Cuantos libros desea ingresar?"; string entrada; getline(cin, entrada); //Se asigna el valor ingresado tamanio = stoi(entrada); //Se transforma la entrada en número libros = new string*[tamanio];//Se asigna el número de filas según el usuario cout << "Por favor ingrese la siguiente información de los Libros: n"; string titulo ,autor; for(int i = 0; i < tamanio; i++) { libros[i] = new string[cols]; //Cada fila contendrá dos columnas //Notar que cols pudo haber sido ingresada por el usuario también cout << "n******* Libro " << i + 1 << "********:n"; cout << "Titulo: "; getline(cin,titulo); cout << "Autor: "; getline(cin,autor); libros[i][0] = titulo; libros[i][1] = autor; } //Para liberar la memoria debemos recorrer fila por fila primero. for (int i = 0; i < tamanio; ++i) { delete [] libros[i]; //Cada fila de libros es otro array de punteros //Por eso son punteros a punteros } //Luego de limpiar las columnas, quitamos la fila única que quedó delete [] libros; system("pause"); return 0; }
  • 10. Este ejercicio es el perfecto para aclarar dudas o darse cuenta si realmente comprendes el concepto de apuntadores y su aplicación para arrays dinámicos. Debido a que la cantidad de columnas es fija, no se lo pedimos al usuario, simplemente lo declaramos con valor dos. Luego tenemos el puntero, pero no es un puntero cualquiera, al ser una matriz, será un puntero que tendrá otros punteros adentro, por eso se usa doble asterisco, luego se obtiene el tamaño del usuario (cantidad de libros) y al momento de inicializar la fila estamos indicando que es un arreglo de punteros, por eso se usa el * en la línea 23. Luego al interior del ciclo, cuando estamos llenando la matriz, debemos indicar que cada fila estará compuesta por un array de punteros de tamaño dos (dos columnas) y así construimos nuestra matriz dinámica. Debes notar también que la liberación de la memoria es un poco más trabajosa, pues debemos ir fila por fila liberando la memoria de las columnas creadas y luego liberar la fila completa. Ahí podrás notar la diferencia en eficiencia y uso de memoria al usar arreglos o usar matrices. Nota: La instrucción new utilizada con los strings es necesaria para asignar el espacio en memoria para esa colección de elementos. No te preocupes por ello de momento, solo asegúrate de usarla y ya el lenguaje se hará cargo del resto. 10