Tried following code to check what happens when we convert integer pointer to a integer .
#include
#include
int main()
{
uint64_t PointerToInt(void* ptr){
uint64_t* u=(void*)&ptr;
return *u;
}
if you want to convert pointer to 64 bits unsigned int
135680008
is the address in decimal (it would be 0x8165008
in hex) to which p
is pointing: the address of the memory area allocated with malloc
.
Apparently you confuse the pointer with the content of the pointer.
As an analogy to the real world, you could say that, with me pointing at a bird, you want to convert my index finger to a bird. But there is no relation between the type 'bird' and 'finger'.
Transferring that analogy to your program: you are converting the object pointing to your int
to an int
itself. Since a C pointer is implemented as 'the number of a memory cell', and since there are lots of memory cells available, it's obvious that (int)p
will result in a very big number.
Casting is a nasty thing. It's a coincidence that pointers are quite analogous to integers. If they were implemented as "the nth address of the mth memory bank", you wouldn't be asking this question because there wouldn't have been an obvious relation, and you wouldn't have been able to do this cast.
Here you're printing out the memory address of a
, but you're printing it as a signed decimal integer. It doesn't make too much sense as a format, because some high memory addresses, the exact boundary depending on your word size and compiler, will be printed as negative.
The standard is to print it as an unsigned hexadecimal padded with zeroes to 8 or 16 characters (really, this is dependent on the exact word-size again). In printf
, this would be %#08X
, so the memory address 0x243 would be printed as 0x00000243.