Problema con la notación de punteros

Iniciado por apoeti, 10 Julio 2014, 17:05 PM

0 Miembros y 1 Visitante están viendo este tema.

apoeti

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.

eferion

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.

apoeti

#2
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?

MinusFour

#3
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.

eferion

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*

apoeti

Ah, vale, entendido.

Gracias a los dos :)