[Apuntes C++] Punteros

Solicite, consulte o publique recursos de referencia para desarrolladores.

[Apuntes C++] Punteros

Notapor julen26 » Mar Sep 25, 2007 9:22 pm

Hola!! como mi primer mensaje, decir que el tiempo que e estado observando este lugar, a sido largo. Y después de leer articulos y etc. me doy cuenta de que este puede ser mi sitio.

Aqui traigo apuntes sobre unas sesiones de aprendizaje a tiempo real que me hizo un amigo mio, Diego. Voy completando los apuntes y los pondré aquí. Son simples, para gente que aún no sabe sobre ello.

Esta vez traigo sobre los punteros, luego colocaré el de sobre las estructuras. Repito: no es nada muy extendido, es lo muy básico y puede servir de referencia.

Las variables se almacenan en la memoria. La ventaja es que el acceso a la memoria es muy rápido, por lo que puedes leer variables y tambien escribirlas. Si en cambio se usa el disco duro para almacenar variables, sería mucho mas lento.
El lugar donde se guarda la variable en la memoria se puede identificar por un valor. Y C/C++ tiene la capacidad de acceder directamente a la memoria, conociendo el valor que indica donde se encuentra.
Un puntero se declara usando el * .
Por ejemplo para declarar una variable haces lo siguente:

Código: Seleccionar todo
int variable ;

Y para declarar un puntero se hace así:

int *variable ;


Con esto se declara un puntero que apunta a un tipo de variable int, es decir, que el puntero contendrá la direccion en la memoria de una variable tipo int.
Existe tambien este poerador, que es el &, este operador devuelve la direccion en la memoria donde se encuentra la variable. Lo usariamos de esta manera, despues de crear un puntero llamado 'puntero' y una variable llamada 'variable', los dos de tipo int:

Código: Seleccionar todo
puntero = &variable ;


Con esto, en el puntero se almacenaria la direccion en la memoria donde se encuetra la variable.
Aqui un ejemplo:

Código: Seleccionar todo
int main()
{
   //Declaramos una variable tipo int
   int variable ;
   //Definimos la variable
   variable = 5 ;
   
   //Declaramos el puntero, que apunta a un tipo int
   int *puntero ;
   //Definimos el puntero
   puntero = &variable ; //Como ya se a dicho, el operador & devuelve la direccion en la memoria donde se encuentra la variable y la almacena en el puntero
   
   //Mostrar la direccion en la memoria de variable
   printf("&variable  == %d\n", &variable) ;

   //Mostrar la direccion en la memoria a la que apunta el puntero, que es el mismo que a donde apunta la variable
   printf("puntero    == %d\n", puntero) ;

   //Mostrar el valor de la variable
   printf("variable == %d\n", variable) ;

   //Mostrar el valor que se encuentra en el lugar de la memoria donde apunta el puntero, que es el mismo que la variable, ya que este puntero apunta al lugar donde esta se encuentra.
   printf("(*puntero) == %d\n", (*puntero)) ;

   return 1 ;
}


Como ya se a dicho, todas las variables se almacenan en un cierto lugar de la memoria. Este lugar se identifica con un valor que en este caso se guarda en el puntero. El lugar donde se encuentra una variable en la memoria se encuentra usando el operador & por delante de la variable, es decir, si haces &variable obtendras el lugar donde se encuentra la variable en la memoria. Un puntero es directamente un lugar de la memoria, se dice que un puntero apunta a un lugar en la memoria.
Al usar el * en un puntero, obtienes el valor que se encuentra en la memoria donde apunta el puntero.
Ahora prueba a añadir esto antes del codigo de mostrar el valor de la variable:

Código: Seleccionar todo
*puntero = 1 ;


De esta manera cambias la variable a 1. Prueba y veras que es lo que cambia. Al modificar el puntero, tambien modificas directamente el valor de la memoria. Segu el compilador que uses, seguramente se cierre enseguida el programa y no podras ver el cambio, asi que añade
Código: Seleccionar todo
getchar() ;
antes del return y asi no te saldras del programa, ya que el mismo esperara a que escribas algo.
Tambien podeis hacer lo siguiente:
en vez de esto
Código: Seleccionar todo
puntero = &variable ;

puedes utilizar tambien esto
Código: Seleccionar todo
*(&variable) ;
recordando el orden de los operadores.

saludos
Avatar de Usuario
julen26
 
Mensajes: 10
Registrado: Dom May 13, 2007 3:04 pm

Notapor hugoruscitti » Vie Sep 28, 2007 10:04 pm

Hola 'julen26', ante todo quiero dar las gracias por tus tutoriales, me .
ha venido bien leer algo sobre punteros y estructuras, y creo que servirá
a muchas otras personas también.

Lo único que puedo agregar desde aquí es un simple comentario: existe
un programa muy interesante llamado "DDD", que permite conocer el estado
de un programa (por ejemplo el valor de cada variable o puntero) de forma
que un programador puede analizar y corregir errores.

Este programa actúa junto a 'gdb', el depurador histórico que desarrolló
Richard Stallman (el creador del proyecto GNU, la FSF, la licencia GPL,
emacs etc...).

Lo interesante de "DDD", en este caso, está en que nos permite colocar
"puntos de corte" (breakpoints) para detener el programa, y con un simple
'doble click' en cada variable podremos conocer el valor de la misma. Aquí
dejo una captura de pantalla del programa en funcionamiento:

Imagen

el único requisito para utilizar "DDD" es compilar el programa indicando
al compilador que necesitamos "depurar" el programa. Eso se puede hacer
colocando el parámetro '-g' o '-ggdb3' al generar un fichero objeto:

Código: Seleccionar todo
gcc -ggdb3 -c -o ejemplo.o ejemplo.c
gcc ejemplo.o -o ejemplo


bueno, en este caso el programa realizado está en C, pero también funciona
con programas desarrollados en C++.

Creo que es un magnifico programa para conocer un poco mas acerca de como
funciona un programa "por dentro".

Aquí dejo otra captura de pantalla mostrando 2 estructuras conectadas por
un puntero, también conocidos como nodos de una lista:

Imagen

esas variables con valores feos como "0x31a..." son punteros, y puedes
hacer 'doble-click' sobre ellos para conocer a donde apuntan.



Ah, lo olvidaba, para instalar el programa solo necesitan escribir lo
siguiente desde un terminal del sistema Ubuntu o Debian GNU/Linux:

Código: Seleccionar todo
sudo apt-get install ddd


todo lo necesario para usar el programa se instalará directamente desde
los repositorios de la distribución. Ahora solo resta ejecutar "DDD" con
el programa a inspeccionar:

Código: Seleccionar todo
ddd ./ejemplo


Es todo, y nuevamente gracias 'julen26'.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina

Notapor julen26 » Sab Sep 29, 2007 10:26 am

realmente parece interesante!

Has dicho que "DDD" actua junto con dbg, por lo tanto necesitaría dbg no?
Eso también lo puedo instalar mediante apt-get?

saludos
Avatar de Usuario
julen26
 
Mensajes: 10
Registrado: Dom May 13, 2007 3:04 pm

Notapor hugoruscitti » Sab Sep 29, 2007 4:30 pm

julen26 escribió:realmente parece interesante!

Has dicho que "DDD" actua junto con dbg, por lo tanto necesitaría dbg no?
Eso también lo puedo instalar mediante apt-get?

saludos
Sí, puedes ejecutar:

Código: Seleccionar todo
sudo apt-get install ddd gdb


y se instalan ambos. También puedes utilizar "pydb" si usas
python.

pd: ten en cuenta que el nombre del depurador es "gdb", en
tu mensaje anterior está escrito de otra manera.

Saludos.
Avatar de Usuario
hugoruscitti
Site Admin
 
Mensajes: 1242
Registrado: Dom Jul 30, 2006 3:57 am
Ubicación: Buenos Aires, Argentina


Volver a Artículos, traducciones y documentación

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 33 invitados