[C con Clase] Punteros

Programante programante en gmail.com
Mar Feb 27 00:21:52 CET 2007


Alejandro Vilar López escribió:
> Hola, tengo varias dudas sobre los punteros:
>
>    1. ¿Puedo averiguar la dirección de memoria de cualquier cosa de mi
>       ordenador?
>    2. Si apunto on "int *pA" a un int cualquiera y luego hago: "pA
>       ++;  *pA = 0;" me da un error,¿ por qué?
>    3. ¿Puedo averiguar la dirección de memoria más baja yt la más alta
>       de mi ordenador?
>    4. La más importante, habláis de ellos como algo muy útil, ¿me
>       podéis decir algún ejemplo de uso de punteros?(es que no les veo
>       la utilidad)
>
> Un saludo, Alejandro.
>
Se podría hacer en un entorno como MS-DOS, donde no hay protección de 
memoria (aunque no todas las direcciones existen). En Windows se usa 
memoria virtual, es como si cada programa tuviera a su disposición todo 
el mapa de memoria (4Gb) para él solo (de los cuales la mitad (2Gb - 256 
Kb) están disponibles para el programa de usuario).
Te da un error porque estás intentando acceder a una dirección de 
memoria que no pertenece a tu proceso (tendrías que reservarla primero). 
En SO anteriores sí podría llegar a funcionar. Entonces el programa cuyo 
dato has modificado, "haría cosas raras", cerrándose en el mejor de los 
casos (en el peor de los casos, podrías haber puesto a 0 un cálculo 
intermedio en la factura y a ver quién lo detecta). Este programa que se 
te cuelga puede ser desde la calculadora, al explorarador o el propio SO 
(las famosas BSOD).


Los punteros resultan muy útiles, aunque también hay que saber 
manejarlos con cuidado. Piensa en un enorme dato que quieres pasar a una 
función para que trabaje con él. Pasarlo "por copia" es muy costoso. En 
cambio, si pasamos un puntero al dato, sólo copiamos 4 bytes (el tamaño 
del puntero), y con ello la función puede acceder al dato original.
Esta es la única forma de hacerlo en C. En C++ también se puede hacer 
con referencias. Posiblemente ya las consideres útiles. Lo que 
probablemente no sepas es que en realidad están basadas en punteros, son 
una "variante de punteros", más segura de usar. Con punteros se pueden 
hacer todas las cosas que se hacen con referencias, y unas cuantas más.




Más información sobre la lista de distribución Cconclase