8
votes

Conversion du pointeur entier en entier

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


3 commentaires

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) après que vous n'en ai plus besoin.


D'une certaine manière, les deux variables portent des adresses :)


4 Réponses :


16
votes

Apparemment, vous confondez le pointeur avec le contenu du pointeur.

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".

Transférer cette analogie à votre programme: vous convertissez l'objet pointant vers votre int à un int 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 de cellules de mémoire disponibles, il est évident que (int) p entraînera un très grand nombre.

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 adresse de la banque M th 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.


0 commentaires

4
votes

135680008 est l'adresse de décimal (ce serait 0x8165008 dans hexagone) à quel p pointe: l'adresse de la zone de mémoire attribué avec malloc .


0 commentaires

1
votes

Ici, vous imprimez l'adresse mémoire de A , 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.

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 printf , ce serait % # 08x , de sorte que l'adresse de la mémoire 0x243 serait imprimée sous 0x00000243.


0 commentaires

1
votes
uint64_t PointerToInt(void* ptr){
    uint64_t* u=(void*)&ptr;
    return *u;
}
if you want to convert pointer to 64 bits unsigned int

0 commentaires