2011-02-02 3 views
7

Essayé le code suivant pour vérifier ce qui se passe lorsque nous convertissons un pointeur entier en entier.Conversion du pointeur entier en entier

#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 

Quelqu'un peut-il expliquer, le concept lié à cette conversion? Tous les liens fournis liés à ce sujet seraient également utiles.

+1

Je ne sais pas vraiment quelle est la question ici. Évidemment, si vous avez écrit ce code, vous devez comprendre comment/pourquoi cela fonctionne, et la sortie que vous obtenez est comme prévu. –

+1

juste une note: assurez-vous d'avoir 'free (p)' après que vous n'en ayez plus besoin. – xtofl

+0

dans un sens, les deux variables contiennent des adresses :) –

Répondre

11

Apparemment, vous confondez le pointeur avec le contenu du pointeur. Par analogie avec le monde réel, vous pourriez dire que, en pointant un oiseau, vous voulez convertir mon index en oiseau. Mais il n'y a pas de relation entre le type 'oiseau' et 'doigt'.

Transférer cette analogie à votre programme: vous convertissez l'objet pointant vers votre int en un int lui-même. Comme un pointeur C est implémenté comme 'le numéro d'une cellule mémoire', et qu'il y a lots de cellules mémoire disponibles, il est évident que (int)p se traduira par un très grand nombre.

Lancer est une mauvaise chose. C'est une coïncidence que les pointeurs soient tout à fait analogues aux entiers. Si elles ont été implémentées comme "la banque de mémoire", vous ne seriez pas poser cette question parce qu'il n'y aurait pas eu de relation évidente, et vous n'auriez pas été en mesure de fais ce casting.

4

135680008 est l'adresse en décimal (il serait 0x8165008 en hexadécimal) à laquelle est p de pointage: l'adresse de la zone mémoire allouée à malloc.

1

Ici, vous imprimez l'adresse mémoire a, mais vous imprimez sous la forme d'un nombre entier décimal signé. Cela n'a pas beaucoup de sens en tant que format, car certaines adresses en mémoire haute, la limite exacte en fonction de la taille de votre mot et du compilateur, seront imprimées en négatif.

La norme est de l'imprimer en tant que hexadécimal non signé, avec des zéros à 8 ou 16 caractères (en fait, cela dépend à nouveau de la taille exacte des mots). Dans printf, ce serait %#08X, de sorte que l'adresse de mémoire 0x243 serait imprimée comme 0x00000243.