指针是否存储为整数?

时间:2013-06-14 17:44:49

标签: pointers language-agnostic

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

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

5 个答案:

答案 0 :(得分:6)

这里有几个隐含的问题,所以让我们理解每个问题都存在。

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

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

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

但是,C / C ++中的指针一直被定义为黑盒数据类型。你不会假设将它们用作整数,因为它们很可能没有你所谓的"数值"有意义的背景。

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

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

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

特定的实现很可能会这样:

p++;

意思是这样的:

i -= sizeof(element);

即。逆转记忆空间。我不知道任何这样的环境,计算机,运行时,编译器或其他什么,但文档允许

这就是你应该关注的事情。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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

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

不同

答案 3 :(得分:-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

答案 4 :(得分:-2)

指针变量使用4个字节将其地址存储在堆栈中,但是在堆上保持一个位置和跟踪内存,这是附加引用的位置,表示引用可以跟内存空间一样大的内存可用的电脑