ayuda: problema con punteros

yecko81
04 de Octubre del 2005
hola amigos, tengo la siguiente duda sobre punteros.

Tengo la siguiente estructura creada:

struct infoBloque
{
unsigned short int ID;
unsigned int longitud;
unsigned int bytesLeidos;
};

y la siguiente funcion que hace uso de la estructura:

void conoceBloque (infoBloque * bloque)
{
bloque->bytesLeidos =
fread (&bloque->ID, 1,2,fichero);
bloque->bytesLeidos +=
fread (&bloque->longitud,1,4,fichero);
}
mi pregunta es: ¿Por qué antes de bloque->ID y antes de bloque->longitud se coloca un & y sin embargo antes de bloque->bytesLeidos no? no lo entiendo ya que tanto id, como longitud , como bytesLeidos son miembros de una misma estructura y debería accederse a ellos de la misma manera no??? si alguien me puede echar un cable le estaria muy agradecido.

kike
04 de Octubre del 2005
Saludos,
Si te fijas tanto en el caso de id como longitud, estas pasando una referencia del tipo de dato que devuelve el apuntador-> es decir (unsigned short int o unsigned short int )le pones el & para que la funcion reciba una referencia de la variable y asi pueda modificarla si es preciso.
Pero en el caso de bytesleidos primero accedes al miembro de la estructura por el operador -> y despues le sumas(+=) el resultado de la funcion fread, como la manipulacion de bytesLeidos la realizas aqui no necesitas el operador de referencia.

No se si mesplico, el puntero es( bloque)con el operador ->accedes al miembro(ID,longitud,bytesLeidos)una vez obtenido el miembro le puedes aplicar cualquier operador que sea aceptado por esta (+=), pero cuando una funcion te pide una referencia como parametro debes añadirle el operador & si usas el operador ->, Si fread te admitiese un tipo referencia a bloque, como este es un puntero ya no deberias usar &.

No se si queda claro, a mi los punteros es uno de los temas que mas me cuesta, pero cuando funcionan le dan mucha versatilidad al software.

chuidiang
04 de Octubre del 2005
Hola:

bloque->bytesLeidos es un entero. Para asignar un valor a un entero estilo

bloque->bytesLeidos = valor;

no necesitas puntero, al igual que en

int a;
a=3;
a = funcion_que_devuelve_entero();

tampoco lo necesitas.

En los otros dos casos si lo necesitas porque estás pasándolos como parámetros a la funcion fread(). La funcion fread() necesita como primer parámetro un puntero.

bloque->ID y bloque->longitud son short e int, no son punteros. Necesitas añadir el & delante para transformarlos en punteros.

Se bueno