essayé après le code suivant pour vérifier ce qui se passe lorsque nous convertissons le pointeur entier en un 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
4 Réponses :
Apparemment, vous confondez le pointeur avec le contenu du pointeur. P>
Comme analogie du monde réel, vous pourriez dire que, avec moi, pointant sur un oiseau, vous voulez convertir mon index en un oiseau. Mais il n'y a pas de relation entre le type "oiseau" et "doigt". P>
Transférer cette analogie à votre programme: vous convertissez l'objet pointant vers votre Casting est une chose méchante. C'est une coïncidence que les pointeurs sont assez analogues aux entiers. S'ils ont été mis en œuvre comme "le n th sup> adresse de la banque M th sup> banque de mémoire", vous ne poseriez pas cette question car il n'y aurait pas eu de relation évidente et vous n'auriez pas pu faire ce casting. P> int code> à un int code> lui-même. Puisque un pointeur C est mis en œuvre comme "le nombre d'une cellule mémoire", et comme il y a lots em> de cellules de mémoire disponibles, il est évident que (int) p code> entraînera un très grand nombre. p>
135680008 code> est l'adresse de décimal (ce serait 0x8165008 code> dans hexagone) à quel p code> pointe: l'adresse de la zone de mémoire attribué avec malloc code>. p>
Ici, vous imprimez l'adresse mémoire de La norme consiste à l'imprimer comme une hexadécimale non signée rembourrée avec des zéros à 8 ou 16 caractères (vraiment, cela dépend de la taille de mot exacte). Dans A code>, mais vous l'imprimez comme un entier décimal signé. Cela n'a pas trop de sens qu'un format, car certaines adresses de mémoire élevées, la limite exacte en fonction de votre taille de mot et de votre compilateur, seront imprimées comme négatives. P>
printf code>, ce serait % # 08x code>, de sorte que l'adresse de la mémoire 0x243 serait imprimée sous 0x00000243. P>
uint64_t PointerToInt(void* ptr){
uint64_t* u=(void*)&ptr;
return *u;
}
if you want to convert pointer to 64 bits unsigned int
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.
Juste une note: assurez-vous d'avoir un
gratuit (p) code> après que vous n'en ai plus besoin.D'une certaine manière, les deux variables portent des adresses :)