duda sobre los punteros

muzycal_es
10 de Abril del 2005
Hola, tengo una duda sobre los punteros. Tengo 3 variables entereas con 3 números y quiero asignar mediante punteros una dirección exacta por ejemplo, 3005, es decir que en esta dirección se quede mi valor (bueno antes tengo que decir que después de declarar las 3 variables, declaro 3 punteros iguales, y con ellos tengo que asignar la dirección de memoria exacta a los datos de las variables.
Gracias

carmamezo
10 de Abril del 2005
Hola, lo siento pero no puedes hacer tal cosa... Los sistemas operativos actuales son multitarea, y para evitar que unos procesos "contaminen" a otros el SO da a cada programa un espacio en memoria que será sólo suyo, en el momento en que un programa intenta acceder a una posición de memoria que no le pertenece, el SO lo interrumpe y genera un mensaje de error (una excepción)... el típico de windows es "Unhandled exception in programa.exe 0xxxxxx Access violation".
Pues eso, que tu programa a violado la protección de acceso a memoria de los programas, ha intentado acceder a una posición que no era suya... Prueba lo siguiente:
int *a;
a=0x3000;
printf("%d",*a);
Verás que te aparece ese mensaje, pues esa dirección seguramente no te pertenece (sería muy raro que casualmente fuera tuya...).
Cada vez que declaras una vble en tu programa, el SO le da una dirección en memoria, y tu puedes acceder a ella, ahora bien esa dirección es estática, no se puede variar. Si lo que quieres es guardar espacio en memoria lo puedes hacer mediante malloc(), pero esta función sólo te permite guardar un espacio de memoria que te asignará el SO, no le puedes dar tú una dirección cualquiera.
Esto es bastante lógico, pongamos el caso de que estas escribiendo algo en el word, y al mismo tiempo tu programa lee de un fichero, y el SO te deja que esa información leida resida en la posición de memoria que mas te guste. Podría darse el caso de que casualmente esa posición sea usada por el word para guardar el texto que estás escribiendo, al modificar esa información, estarías variando el contenido del word sin darte cuenta... Imagina lo que podría pasar con programas más importantes para el sistema...

Al margen de toda esta charla decirte que para conocer la posición de memoria de una vble lo puedes hacer de la sigte forma:
int a,b,c, *pa,*pb,*pc;
...
a=100;
b=200;
c=300;
pa=&a;//puntero_a contendrá la dirección de a.
pb=&b;//puntero_a contendrá la dirección de b.
pc=&c//puntero_a contendrá la dirección de c.
...
ahora bien recuerda que en el momento en que pa,pb o pc apunten a otro sitio te saldrá el mítico mensajito (muy conocido por los programadores...)
Para conocer la posición de memoria de estos punteros puedes hacer lo sigte:
printf("%d %d %d",pa,pb,pc);//en decimal
o
printf("%x %x %x",pa,pb,pc);//en hexadecimal
y para conocer el contenido de esas posiciones:
printf("%d %d %d",*pa,*pb,*pc);
Seguramente sean posiciones correlativas con una diferencia de 4 (4 bytes por int), esto se debe a que normalmente las vbles tienen direcciones consecutivas, porque se crearon de manera consecutiva. Aunque no creas que esas direcciones son las auténticas, esas direcciones son fáciles de usar por el programador pero no tienen porque ser las verdaderas direcciones de memoria (la direccion exacta dentro de la RAM)... Existe un mecanismo de paginación... Piensa que si creas un array de 1000 posiciones estas serán consecutivas dentro de tu programa, pero puede que en tu RAM no haya tantas posiciones consecutivas libres, por tanto las direcciones que tu crees correlativas no lo son en RAM.
Pero ese es ya otro tema y estoy cansado de escribir...
Si tienes alguna otra duda ya sabes... Siento la chapa...
Un saludo.

Alejandro_
10 de Abril del 2005
Estoy de acuerdo con que asignar una dirección específica de memoria a una variable es "peligroso", siempre que no sepamos con certeza que esa posición no está siendo ocupada por alguna parte de nuestro propio programa que no queremos sobreescribir. Aunque "por principio", el C++ no impide hacerlo, ya que se supone que el programador sabe lo que hace, y que puede estar programando algún dispositivo que necesite algún valor en algún lado y no en otro.
Por ejemplo, al compilar y ejecutar este programita:
#include <cstdio>

int main()
{
char* p = reinterpret_cast<char*>(0x30000);
printf("p apunta a %pn", static_cast<void*>(p));
*p = 'a';
printf("*p = %cn", *p);
}

En mi máquina se lee:

p apunta a 00030000
*p = a


Alejandro

miguel
10 de Abril del 2005
No debes asignar a los punteros direcciones de memoria a lo loco, a no ser que estés tramando algo chungo.

Date cuenta de que entre tú y la memoria está el sistema operativo (S.O.) que gestiona la memoria. Lo que intentas hacer es equivalente a que fueses a un edificio e intentases meter a una familia en casa de otro o en una casa vacía por el morro. Tienes que contar con el gerente del bloque (el S.O.) para hacer esto.

Puedes encontrar más información sobre punteros, referencias, operadores de punteros y reserva de memoria en el "Manual Imprescindible de C/C++" de Anaya Multimedia. Ahí viene todo eso muy claro y explicado con muchos dibujos para que te des una idea de cómo va el tema.

Un saludo.