2011-02-02 21 views
7

Probé el código siguiente para verificar qué sucede cuando convertimos el puntero entero en un entero.Conversión del puntero entero en entero

#include<stdio.h> 
#include<stdlib.h> 
int main() 
{ 
     int *p; 
     int a; 
     p = (int *)malloc(sizeof(int)); 
     *p = 10; 
     a = (int)p; 
     printf("%d\n",*p); 
     printf("%d \n",a); 
     return 0; 
} 

The output is : 10 
       135680008 

¿Alguien puede explicar el concepto relacionado con esta conversión? Cualquier enlace proporcionado relacionado con este tema también sería útil.

+1

Realmente no sé cuál es la pregunta aquí. Obviamente, si escribió ese código, debe comprender cómo y por qué funciona, y el resultado que obtiene es el esperado. –

+1

solo una nota: asegúrate de tener un 'libre (p)' después de que ya no lo necesites. – xtofl

+0

en cierto modo, ambas variables tienen direcciones :) –

Respuesta

11

Aparentemente, se confunde el puntero con el contenido del puntero.

Como una analogía con el mundo real, podría decir que, al señalar un pájaro, quiere convertir mi dedo índice en un pájaro. Pero no hay relación entre el tipo 'pájaro' y 'dedo'.

Transfiriendo esa analogía a su programa: está convirtiendo el objeto que apunta a su int en un int sí mismo. Dado que un puntero C se implementa como 'el número de una celda de memoria', y dado que hay lotes de celdas de memoria disponibles, es obvio que (int)p resultará en un número muy grande.

Casting es una cosa desagradable. Es una coincidencia que los punteros sean bastante análogos a los enteros. Si se implementaron como "la n th dirección del banco de memoria m th", no harías esta pregunta porque no habría habido una relación obvia, y no hubieras podido haz esto.

4

135680008 es la dirección en decimal (sería 0x8165008 en hexadecimal) a la que está apuntando p: la dirección del área de memoria asignada con malloc.

1

Aquí está imprimiendo la dirección de memoria a, pero la está imprimiendo como un entero decimal con signo. No tiene demasiado sentido como formato, porque algunas direcciones de memoria alta, el límite exacto que depende del tamaño de la palabra y del compilador, se imprimirán como negativas.

El estándar es imprimirlo como un hexadecimal sin signo rellenado con ceros a 8 o 16 caracteres (realmente, esto depende del tamaño de palabra exacto otra vez). En printf, esto sería %#08X, por lo que la dirección de memoria 0x243 se imprimiría como 0x00000243.

Cuestiones relacionadas