| Ver tema anterior :: Ver siguiente tema |
| Autor | Mensaje |
|---|
Oscar18457
Registrado: 22 Ago 2007 Mensajes: 13 Ubicación: Chile
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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
| Publicado: 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 | |
 |
|
|