/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Estudio de punteros

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
Oscar18457



Registrado: 22 Ago 2007
Mensajes: 13
Ubicación: Chile

MensajePublicado: 22/09/2007 2:28 pm
Título: Estudio de punteros

int main()
{
int b=43;
int *a;


printf("valor inicial de b=%d ,direccion de b en memoria %u\n",b,&b);
a=&b;
printf("direcion de b asignada a variable puntero a %u\n",&a);
printf("tamano de variable b, %d bytes\n",sizeof b);
*a=1000;
printf("valor de variable b,cambiado por modificar puntero a (a) b=%d\n",b);

system("pause");
return 0;
}

He seguido investigando punteros, aquí se presenta algo especial: Al asignar la direccion de la variable b a puntero a, tenemos una diferencia de 4bytes. Esto se deberá a que al pedir la dirección b, esta muestra la última posición de la asignación y en cambio puntero a b muestra la dirección del primer byte de b. Alguien podrá corrobar si esto es así. Trabajo con windowXP version 2002 SP 2 y Devc++ version 4992. Gracias
_________________
oa
Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 1372
Ubicación: En ecx esperando un call

MensajePublicado: 22/09/2007 2:46 pm
Título:

Estas mostrando la direccion propia del puntero no la dirección que almacena, en otras palabras, un puntero a puntero.
Esta dirección tiene que ser exactamente la misma que la referencia a la variable 'b'.
Código:
printf("direcion de b asignada a variable puntero a %p\n", a);
Y siguiendo el mismo hilo, lo correcto es usar el especificador de formato %p para direcciones de punteros o simplemente direcciones, tambien podrias añadir un typecast con el especificador %d.
Código:
 printf("direcion de b asignada a variable puntero a %d\n",(int) a);

S2.
_________________
- Explícito es mejor que implícito.
- Simple es mejor que complejo.
- Complejo es mejor que complicado.
- Plano es mejor que anidado.
- Ralo es mejor que denso.
Volver arriba
Oscar18457



Registrado: 22 Ago 2007
Mensajes: 13
Ubicación: Chile

MensajePublicado: 22/09/2007 3:09 pm
Título: Estudio de punteros

cheroky, gracias por tu tiempo pero no me queda claro, puedes extender un poco más la explicación?, no veo lo de puntero a puntero. Según tenía entendido al hacer &b le estaría dando la dirección donde se encuentra la variable b al puntero a .
_________________
oa
Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 1372
Ubicación: En ecx esperando un call

MensajePublicado: 22/09/2007 3:30 pm
Título:

Código:
 int var, *ptr;

    ptr = &var;
   
        printf("direccion de var %p  direccion de var en ptr %p\n", &var, ptr);
         
        printf("direccion de ptr (puntero a puntero) %p", &ptr)


Como puedes observar en el primer printf ambas direcciones son la mismas, en el ultimo printf la direccion corresponde a la del mismo puntero (puntero a puntero) puesto que es la direccion de una variable puntero.

S2.
_________________
- Explícito es mejor que implícito.
- Simple es mejor que complejo.
- Complejo es mejor que complicado.
- Plano es mejor que anidado.
- Ralo es mejor que denso.
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 3657
Ubicación: Mexico

MensajePublicado: 22/09/2007 3:32 pm
Título:

El operador "direccion de" (el '&') resulta en un valor de tipo "T *" donde "T" es el tipo del objeto al cual se aplica el operador.

Siguiendo la explicacion de Cheroky en la segunda llamada a printf en tu programa:
Código:
printf(
   "direcion de b asignada a variable puntero a %u\n",
   &a
);

La variable "a" es de tipo "int *" y debido a esto el resultado de "&a" es de tipo puntero a puntero a int o "int **", a eso se refiere Cheroky con "un puntero a puntero".

Y para terminar de redonder el tema (impresion de punteros con printf) cuando se utiliza el indicador de tipo "%p" se debe convertir explicitamente el puntero pasado como argumento al tipo "void *":
Código:
printf("a == %p\n", (void *) a);


Un saludo
_________________
The capacity to learn is a gift;
The ability to learn is a skill;
The willingness to learn is a choice.
--
Rebec of Ginaz
Volver arriba
Oscar18457



Registrado: 22 Ago 2007
Mensajes: 13
Ubicación: Chile

MensajePublicado: 22/09/2007 3:41 pm
Título:

Gracias a todos, analizaré las explicaciones y los códigos entregados
_________________
oa
Volver arriba
cheroky



Registrado: 22 Sep 2005
Mensajes: 1372
Ubicación: En ecx esperando un call

MensajePublicado: 23/09/2007 4:01 am
Título:

rir3760 escribió:

Y para terminar de redonder el tema (impresion de punteros con printf) cuando se utiliza el indicador de tipo "%p" se debe convertir explicitamente el puntero pasado como argumento al tipo "void *":
Código:
printf("a == %p\n", (void *) a);


Cierto, revisando la lista de especificadores de formato encontramos que:

Cita:
Conversion specifier %p Argument type void *x



S2.
_________________
- Explícito es mejor que implícito.
- Simple es mejor que complejo.
- Complejo es mejor que complicado.
- Plano es mejor que anidado.
- Ralo es mejor que denso.
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com