9

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

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

4

5 回答 5

9

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

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

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

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

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

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

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

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

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

p++;

意思是这样的:

i -= sizeof(element);

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

这就是你应该关心的。

于 2013-06-14T17:55:53.400 回答
1

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

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

于 2013-06-14T17:48:16.477 回答
1

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

于 2013-06-14T17:51:30.367 回答
-1

指针将是一个 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
于 2013-06-14T17:49:31.810 回答
-3

指针变量使用 4 个字节将其地址存储在堆栈上,但在堆上保持位置和跟踪内存,这是附加引用的位置,这表明引用可能与内存空间一样大的内存有可用的计算机

于 2013-06-14T17:48:45.950 回答