尝试使用以下代码来检查将整数指针转换为整数时会发生什么。
#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
任何人都可以解释一下这个转换的概念吗?提供与此主题相关的任何链接也会有所帮助。
答案 0 :(得分:12)
显然,您将指针与指针的内容混淆。
作为对现实世界的类比,你可以说,当我指着一只鸟时,你想把我的食指转换成一只鸟。但是“鸟”和“手指”之间没有关系。
将该类比转移到您的程序:您正在将指向int
的对象转换为int
本身。由于C指针实现为“存储单元的编号”,并且由于存在可用的存储单元的 lot ,因此(int)p
显然会产生非常大的数字。< / p>
施法是一件令人讨厌的事情。指针非常类似于整数,这是巧合。如果它们被实现为“m th 存储库的n th 地址”,你就不会问这个问题,因为没有明显的关系,你将无法做到这一点。
答案 1 :(得分:4)
135680008
是0x8165008
所指向的十进制地址(十六进制为p
):用malloc
分配的内存区域的地址。 / p>
答案 2 :(得分:1)
这里打印出a
的内存地址,但是您将其打印为带符号的十进制整数。它作为一种格式没有多大意义,因为一些高内存地址,取决于你的字大小和编译器的确切边界将被打印为负数。
标准是将其打印为无符号十六进制,用零填充为8或16个字符(实际上,这取决于确切的字大小)。在printf
中,这将是%#08X
,因此内存地址0x243将打印为0x00000243。
答案 3 :(得分:1)
uint64_t PointerToInt(void* ptr){
uint64_t* u=(void*)&ptr;
return *u;
}
如果要将指针转换为64位unsigned int