【问题标题】:Conversion of integer pointer to integer整数指针到整数的转换
【发布时间】:2011-02-02 09:54:04
【问题描述】:

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

 #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

谁能解释一下与这种转换相关的概念?提供的与该主题相关的任何链接也会有所帮助。

【问题讨论】:

  • 我真的不知道这里的问题是什么。显然,如果您编写了该代码,您应该了解它的工作原理/原因,并且您得到的输出符合预期。
  • 请注意:在您不再需要 free( p ) 后,请确保拥有它。
  • 在某种程度上,两个变量都有地址:)

标签: c pointers


【解决方案1】:

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

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

将该类比转移到您的程序:您正在将指向您的int 的对象转换为int 本身。由于 C 指针被实现为“内存单元的数量”,并且由于有 很多 个可用的内存单元,很明显(int)p 将导致一个非常大的数字。

选角是一件讨厌的事情。巧合的是,指针与整数非常相似。如果它们被实现为“第 mth 内存库的第 nth 地址”,您就不会问这个问题,因为不会有明显的关系,而您将无法进行此演员阵容。

【讨论】:

    【解决方案2】:

    135680008p 指向的十进制地址(十六进制为0x8165008):malloc 分配的内存区域的地址。

    【讨论】:

      【解决方案3】:

      在这里,您打印出a 的内存地址,但您将其打印为有符号十进制整数。它作为一种格式没有太大意义,因为一些高内存地址,确切的边界取决于您的字长和编译器,将被打印为负数。

      标准是将其打印为用零填充到 8 或 16 个字符的无符号十六进制(实际上,这又取决于确切的字长)。在printf 中,这将是%#08X,因此内存地址 0x243 将打印为 0x00000243。

      【讨论】:

        【解决方案4】:
        uint64_t PointerToInt(void* ptr){
            uint64_t* u=(void*)&ptr;
            return *u;
        }
        

        如果要将指针转换为 64 位无符号整数

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2016-12-26
          • 1970-01-01
          • 2021-02-13
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多