将整数指针转换为整数

时间:2011-02-02 09:54:05

标签: c pointers

尝试使用以下代码来检查将整数指针转换为整数时会发生什么。

 #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 个答案:

答案 0 :(得分:12)

显然,您将指针与指针的内容混淆。

作为对现实世界的类比,你可以说,当我指着一只鸟时,你想把我的食指转换成一只鸟。但是“鸟”和“手指”之间没有关系。

将该类比转移到您的程序:您正在将指向int的对象转换为int本身。由于C指针实现为“存储单元的编号”,并且由于存在可用的存储单元的 lot ,因此(int)p显然会产生非常大的数字。< / p>

施法是一件令人讨厌的事情。指针非常类似于整数,这是巧合。如果它们被实现为“m th 存储库的n th 地址”,你就不会问这个问题,因为没有明显的关系,你将无法做到这一点。

答案 1 :(得分:4)

1356800080x8165008所指向的十进制地址(十六进制为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

相关问题