【问题标题】:Are pointers stored as integers? [closed]指针是否存储为整数? [关闭]
【发布时间】:2026-02-24 16:10:02
【问题描述】:

C/C++(或任何语言)中的指针是整数吗?指针保存一个内存地址,从 0 到内存的上限。所以用数学术语来说,指针可以被认为是一个非负整数。

指针在 C/C++ 中是如何存储的?还有其他流行语言?

【问题讨论】:

  • 这取决于实现。
  • 取决于你的意思。指针只是一堆位(在寄存器或另一个内存位置);这些位总是可以重新解释为整数。
  • 指针存储一个内存地址。内存地址的形式取决于硬件。

标签: pointers language-agnostic


【解决方案1】:

这里有几个隐含的问题,所以让我们来看看我理解的每一个问题。

首先,C/C++ 中的指针只是伪装的整数吗?

是的,它们是,不,它们不是。首先,在实现方面,实现点的最常见方法是为平台(32 位或 64 位)选择正确大小的整数,并将其用作可寻址内存空间的绝对地址值。

在这种情况下,您可以说指针只是整数。

但是,C/C++ 中的指针一直被定义为黑盒数据类型。 不应该将它们用作整数,因为它们很可能没有你所说的有意义的“数值”上下文。

当然它们看起来是数字的,您可以向它们添加整数以移过它们等等,但所有这些都是特定于实现的,未记录(故意),因此并不可靠。我这里所说的“可靠”的意思是,如果将指针解释为整数,则不应依赖指针和整数之间存在任何有意义的关系。

对于特定平台、编译器、运行时等,您可能会发现证据表明它没有任何特殊含义,除了被视为寻址可寻址空间中特定字节的数值之外,但我仍然不会那样想。指针是一个黑盒子。

所以下一个问题是您是否可以将保存指针的内存重新解释为整数。嗯,是的,你当然可以这样做,但同样,你应该认为那个整数的实际数值是没有意义的。如果你有一个 32 位指针,你可以将它存储在一个 32 位整数中,反之亦然,但是整数的数值意味着什么,我不会在上面放置任何值。

一个特定的实现可以很好地采用这个:

p++;

意思是这样的:

i -= sizeof(element);

即。反转内存空间。我不知道有任何这样的环境、计算机、运行时、编译器或其他类似的东西,但文档允许这样做。

这就是你应该关心的。

【讨论】:

    【解决方案2】:

    从数学的角度来看,您可以说指针只是内存中的索引。但是,指针不是 int,因为它们可以有不同的大小。 指针以硬件规定的方式存储。在某些机器上它可以是一个 int,但你不应该依赖它。

    具体与编程语言相关,它们必须考虑到它们所指向的对象大小,因此在查看绝对值时算术是不同的。在这方面它不同于简单的int

    【讨论】:

      【解决方案3】:

      有一个反例需要考虑。早期的 x86 处理器使用分段内存架构,其中地址由 两个 整数构成。 C 和 C++ 编译器需要使用能够满足这些需求的指针定义。

      【讨论】:

      • 当前的 x86 仍然使用分段内存,但由于地址空间更大,它不再那么明显了。底层架构仍然相当相似。
      • @Devolus, according to Wikipedia 在 64 位模式下不再是这种情况。实际上,在 32 位模式下不再是这种情况,因为操作系统将内存分配为从零开始的一大段。
      • 操作系统分配单个 32 位页面是一种方便,只是一种特殊设置。架构本身不需要它。
      【解决方案4】:

      指针将是一个 32 位地址(在 32 位机器上),它确实可以转换为“int”。话虽如此,数学不适用于整数。例如:

      int avar = 1;
      int *aptr = *avar;
      aptr++; // Will change the pointer to skip the size of the data type the pointer is pointing to
      

      【讨论】:

      • 指针不一定是 32 位。 int 不一定与指针大小相同。这完全取决于实现。
      • 当然不是。但是对于一个幼稚的例子,它应该是好的。
      【解决方案5】:

      指针变量使用 4 个字节来存储它在堆栈上的地址,但在堆上维护一个位置和跟踪内存,这是附加引用的位置,表明引用可以与内存空间一样大的内存有一台电脑

      【讨论】:

      • 您指的是哪个特定的实现?没有规定指针必须精确为 4 个字节。
      • 在 C/C++ 中,每个指针变量都有 4 个字节来将其地址存储在堆栈中。诠释*ptr; sizeof( ptr ) = 4
      • @jvra:不。反例:在我的机器上,sizeof(int*) == 8(64 位),我知道微处理器是 2(16 位)。