Programación en C/C++: Trabajando con punteros
En el contexto de la programación en C/C++ trabajar con punteros es algo que asusta a la mayoría porque es un tema complicado de entender, pero una vez que se conoce la lógica te das cuenta que no es tan terrible como se pensaba. En éste artículo desarrollaré la lógica de los punteros y sus utilidades para que lo comprendamos mejor.
[tipexperto titulo = “Nota” ] Si nunca has programado en C o C++, te recomiendo primero aprender a programar en el lenguaje, ya que es necesario conocerlo un poco para entender el tema de los punteros.[/tipexperto]
Como se que a la mayoría de nosotros, los programadores (o los que intentamos serlo), nos gusta aprender algo viendo código directamente, mil veces me han explicado algo, pero no lo entiendo hasta ver el código. Asi que trataré de explicar de esa manera para que quede clarísimo el tema. Vamos al grano.
Entendiendo los punteros
Un puntero es básicamente una dirección de memoria. Muchas veces hemos hecho esto:
int numero; numero = 10; printf(“Numero: %i”,numero);
Obteniendo la salida: “Numero: 10”.
Pero, ¿Qué hace el computador en su interior? El computador trabaja con direcciones de memoria, imaginemos los siguientes valores:
Tenemos nuestra variable numero, cuyo valor es 10, y su dirección de memoria es 100. Cuando escribimos la línea “numero = 10; “, le estamos diciendo al computador que en la dirección 100 escriba el valor 10.
Ahora es cuando veremos un puntero, he aquí un código equivalente al anterior:
int numero; int * puntero = № *puntero = 10; printf(“Numero: %i”,numero);
Nuevamente la salida es: “Numero: 10”.
¿Qué hicimos aquí? Vayamos línea por línea para que quede claro:
- int numero: Declaramos nuevamente la variable numero.
- int * puntero = &numero: Declaramos un puntero llamado puntero al cual le asignamos la dirección de memoria de numero (el operador & nos sirve para obtener la dirección de memoria de una variable, en este caso, 100).
- *puntero = 10: Con esto estamos diciéndole al computador: “A lo que esta señalando el puntero (la dirección 100), asignale el valor 10”.
- printf(“Numero: %i”,numero): Mostramos el valor de numero.
Para que quede más claro, veamos los valores que corresponden a nuestras variables hasta la segunda línea:
[tipexperto titulo = “Nota”]
- Para ver el contenido de un puntero, podemos escribir “printf(“%p”,puntero);”
- Los valores de las direcciones de memoria han sido cambiados para mayor comprensión, por ejemplo, la dirección de “numero” en mi computador dio “0022FF18”.
[/tipexperto]
Como vemos, la variable puntero es una variable más, tiene su dirección de memoria (110) y un valor. Lo que hace especial a los punteros, es que alojan una dirección de memoria, en este caso 100, que corresponde a la dirección de memoria de la variable numero (que contiene basura debido a que no la hemos inicializado). Entonces cuando escribimos “*puntero = 10”, decimos: En la dirección 100, escribe el valor 10. Quedando de esta manera:
Operadores &, “*” y la función Scanf
Para que quede más claro, les dejo los casos de uso de los operadores “&” y “*”:
Operador &
Se utiliza para obtener la dirección de memoria de una variable. Se puede implementar con cualquier tipo de variable.
Operador “*”
Se utiliza sólo con punteros. Su función es la de acceder al contenido de la dirección almacenada.
Quiero recalcar que siempre que trabajen con punteros, deben apuntarlo a alguna variable. De lo contrario apuntará a una dirección cualquiera y puede (y es lo mas probable) que te cause errores, además de que tu programa no funcionará como debería.
Función Scanf()
Ahora que saben el uso del operador “&”, quizás entiendan el uso de la típica función scanf, veamos un ejemplo de como se utiliza para leer una variable de tipo entero y guardar el valor en la variable:
scanf("%i",&variable);
Pueden notar el uso del operador “&” antes de “variable”. Así es, scanf recibe un puntero del tipo que se le indica en el primer argumento (“%i indica un entero, por lo tanto, el segundo argumento debe ser de tipo puntero a entero).
En éste primer artículo aprendimos sobre los punteros y sus operadores. En una próxima entrega veremos casos de uso: Punteros para pasar argumentos por referencia a funciones, Arreglos y Matrices con punteros.
Muy bueno el articulo! espero “Punteros para pasar argumentos por referencia a funciones, Arreglos y Matrices con punteros”.
Hace algun tiempo trabaje con punteros…y ya casi me habia olvidado como trabajar con ellos..pero lo he vuelto a recordar!
Desde hace muchos años (como desde el 98) que no veía código en C. Me sirvió mucho para refrescar.
Dale una mirada al primer bloque donde se define el apuntador que te esta convirtiendo el &numero en Nº elige otro nombre de variable para que no te lo transforme.
es recomendable utilizar esto ya que es la base de todo pero lo importante también es aprender de donde nace para todos los que son novatos
Excelente artículo, lo más poderoso que tiene C/C++ son sus punteros y también la razón de que muchos programadores le tengan miedo al lenguaje.
Yo les tuve miedo durante mucho tiempo jaja, se me paso cuando en la Universidad me hicieron hacer un juego que como no era desarrollado con clases, nos veíamos obligados a usarlos, ahí entendí toda la lógica que esta tras ellos (que conceptualmente no es muy complicada, pero igual cuesta). Asi que como recomendación a los que quieran perderle el miedo a los punteros, hagan ejercicios propios, variaciones de los ejemplo que subi, etc.
Y claramente, dominarlos te da ventajas, ya que puedes optimizar tu código o adaptarlo 100% a lo que necesitas.
Saludos
Gracias, que buen articulo, solo corregir la linea que te mencionan arriba: int * puntero = №
Gracias, se corregirá el breve
muy chevere el articulo
Gran artículo. Yo nunca podría vivir sin mis queridos punteros
me gusto el articulo, yo ya vi c++ en la clase de programacion estructurada pero ahorita estoy aprendiendo c#
Ahora deberiamos de hacer un tutorial sobre punteros a funciones y punteros a objetos, asi tendriamos mas ejemplos del poder de los punteros.
Había analizado la posibilidad de incluir punteros a funciones para la segunda parte, pero se extendería mucho el tema. Tendré en cuenta tu comentario y vere si puedo hacer algo :).
Esta bueno a mi me a causado estragos el hecho de lograr comprender como se programa en C y C++ espero sigan contribuyendo con estas explicaciones detalladas ya que los maestros que he tenido no han logrado explicarlo de manera clara y una de las cosas que mas me gusta es la programacion y por ende estoy interesado en poderlo hacer en C y C++ gracias maestros de la web.
Que bueno que te haya gustado el artículo juan :), motiva más saber que el trabajo de uno le fue útil a la gente, así que seguiré poniéndole empeño a los siguientes artículos.
Saludos !
Excelente tu articulo, realmente para la gente que a veces no nos queda claro el tema de apuntadores sirve de mucho. Si en otra ocacion incluirias apuntadores pero ya relacionados con cadenas o arreglos, estaria fenomenal.
Que bueno que te haya gustado el artículo Gilberto, a propósito de lo que comentas, te aviso que hoy se publica la segunda parte del artículo, que tratará precisamente del tema que sugeriste .
buen articulo, en mis inicios en la universidad estuve aprendiendo c++ y la verdad que resultaba impactante al comienzo pero luego descubrimos las ventajas y sobre toda la rapidez de las aplicaciones construidas. A mi entender este es el lenguaje base para poder entender luego otros lenguajes
Thanks for a marvelous posting! I genuinely
enjoyed reading it, you’re a great author.I will ensure that I bookmark your blog and definitely will come back at some point. I want to encourage you continue your great writing, have a nice day!
Sweet blog! I found it while surfing around on Yahoo News.
Do you have any tips on how to get listed in Yahoo News?
I’ve been trying for a while but I never seem to get there! Appreciate it