C/Visual C - Punteros

 
Vista:

Punteros

Publicado por Clayder (16 intervenciones) el 01/02/2008 00:51:05
Hola:

Ultimamente estoy aprendiendo algo de punteros en C; segun lo q lei los punteros son direcciones de memoria y ademas vi por ahi que las direcciones de memoria estan en sistema hexadecimal.

Si los punteros son direcciones de memoria, entonces uno puede escoger la direccion de memoria en la quiere que se almacene una variable, es asi?. Entonces porque cuando hago lo siguiente por ejemplo:

[code]
int *p = (int *)0x0;
*p=5;
printf("%d ", *p);
[/code]

Sale un error en tiempo de ejecución. No se mucho de punteros, pero asumo que esa direccion de memoria ya esta ocupada, es por ello que sale ese error, ¿como seria entonces la forma correcta?, es decir; ¿se puede escoger la direccion de memoria en la que se desea almacenar una variable?.

Ademas de ello, vi por ahi que tambien se podia acceder a la direccion de memoria de la tarjeta grafica,... ¿es asi como se hacen los graficos(desde los mas basicos a los mas complejos)? y ¿como podria hacer eso?

Disculpen por aturdirlos con mis preguntas, y agradezco de antemano su respuesta.

Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Punteros

Publicado por fernando.gomez (1603 intervenciones) el 01/02/2008 02:11:18
En particular escogiste una dirección de memoria... que no existe. La dirección de memoria 0 se emplea para indicar que el puntero... no apunta a algún lado. Es decir, cualquier dirección de memoria hubiera sido mejor que esa.

Luego, en efecto puedes asiganrle a un puntero una dirección de memoria cualquiera:

int* p = 0xFF1109;

pero entonces te tendrías que preguntar: ¿esa dirección de memoria _es_ válida? Porque obviamente el sistema operativo no inicializa toda la memoria de golpe, si no sería tardarísimo. Además, el SO hace mapeos entre diferentes secciones de memoria, por lo que la dirección de memoria 0xFF1109 de la aplicación app1.exe es diferente a la de la aplicación app2.exe, físicamente hablando. Entonces primero deberías asegurarte que tu dirección de memoria _es_ válida. Que es lo que tenían que hacer los programas hasta antes de 1970. Precísamente esa es una de las razones de ser del sistema operativo. Así, lo que tienes que hacer es decirle al sistema operativo que te asigne un pedazo de memoria.

Para hacer esto, de forma estándar en C se emplea la función malloc, mientras que en C++ se emplea el operador new:

// en C
int* p = malloc(sizeof(int)); // le pasas el tamaño en bytes que deseas reservar

// en C++
int* p = new int();

Ahora sí, después de eso podrás "guardar" valores en ese pedazo de memoria:

*p = 6;

Con esto logras que el tipo de dato sea persistente (de no ser así, no tiene sentido que lo hagas de esta forma, sería mejor simplemente un "int p = 6" y te despreocupas.

Ahora, cuando termines de emplear ese pedazo de memoria, deberás regresarlo al sistema operativo, en C lo haces con la función free, y en C++ con delete:

// C
free(p);

// C++
delete p;

Ahora bien, el sistema operativo siempre reserva espacios de memoria especiales que son fijos (me parece que el bloque es desde 0x00000001 hasta 0xFFFFFFFF. En diferentes secciones se almacenan valores correspondientes, sobre todo, al hardware (discos duros, tarjetas de vídeo, etc). Pero para saber qué dirección corresponde a qué... bueno, tienes que consultar con el proveedor del BIOS y eventualmente con las entrañas de Windows o Unix o cualquiera que sea tu SO. Pero hacerlo no es recomendable, ya que corres el riesgo de echar a perder toda tu computadora, BIOS incluido.

Finalmente, sí, los gráficos se hacen así como describes, pero rara vez se hace así manualmente. Hay capas y APIs que son las que usualmente se emplean para hacerlo de forma estándar y sin riesgos de echar a perder tu máquina. GDI es lo que se emplea bajo Windows (y con eso se crean las ventanas), XWindow para sistemas Unix. Cuando quieres saltarte esta capa del sistema operativo, puedes emplear otras de bajo nivel como DirectX u OpenGL. Nadie se mete a tratar directamente con la tarjeta de vídeo, eso solo lo hacen los creadores de hardware.

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Punteros

Publicado por Clayder (16 intervenciones) el 01/02/2008 03:08:43
Gracias, todo quedo claro.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar