Hola.
Me ha surgido una pequeña duda repasando el tema de los punteros. La duda sale a partir de este código:
#include <stdio.h>
void main(void)
{
char *p;
p = (char*)3500; /* La duda me surge con este (char *) */
while (p< (char*)5500)
{
printf("%c", *p);
p++
}
}
Como digo en el código, la duda me surge con el (char *). No entiendo muy bien para qué sirve. Me estuve informando un poco acerca del casting de punteros, pero eso es con punteros genéricos void, y aquí no parece que tenga mucho que ver ¿Esa sentencia sería equivalente a esta otra?
*p = 3500;
Un saludo y gracias de antemano.
p = (char*)3500;
En esa línea estás haciendo que el puntero p apunte a la dirección 3500.
El cast lo hace porque a "p" le estás pasando un entero... y dado que "p" es un puntero, fuerza la compatibilidad entre tipos con un cast.
El programa básicamente imprime por pantalla el contenido de la memoria de la posición 3500 a la 5500.
Y el hecho de que fuerce un cast a char es porque el puntero "p" está declarado como apuntador a char, ¿no? ¿Podría haberse elegido cualquier otro tipo para apuntar? ¿No se podría haber elegido tipo int para evitar el casting?
No se si el compilador te tire algún error pero basicamente está diciendo que está apuntando a un dato de typo char en la dirección 3500. CUando lo dereferencias estás escribiendo/leyendo en un byte. Me imagino que si te acepta un int* cuando lo dereferencias estás escribiendo/leyendo en 4 bytes, pero no estoy seguro si no te tire error el compilador.
Cita de: HastatusXXI en 10 Julio 2014, 17:28 PM
Y el hecho de que fuerce un cast a char es porque el puntero "p" está declarado como apuntador a char, ¿no? ¿Podría haberse elegido cualquier otro tipo para apuntar? ¿No se podría haber elegido tipo int para evitar el casting?
se hace un cast a char* porque "p" es de tipo char*... si "p" fuese de tipo unsigned long long* entonces el cast hubiese sido a unsigned long long*
Ah, vale, entendido.
Gracias a los dos :)