Pointers 指针是否存储为整数?

Pointers 指针是否存储为整数?,pointers,language-agnostic,Pointers,Language Agnostic,C/C++(或任何语言)中的指针是整数吗?指针包含内存地址,从0到内存上限。因此,在数学术语中,指针可以被视为非负整数 指针是如何存储在C/C++中的?在其他流行语言中,从数学的角度来看,你可以说指针只是内存的索引。但是,指针不是int,因为它们可以有不同的大小。 指针以硬件指定的方式存储。在某些机器上,它可以是int,但不应该依赖于此 特别是与编程语言相关的,它们必须考虑它们所指向的对象大小,因此在查看绝对值时,算法是不同的。在这方面,它不同于简单的int指针变量使用4个字节将其地址存储在堆栈

C/C++(或任何语言)中的指针是整数吗?指针包含内存地址,从0到内存上限。因此,在数学术语中,指针可以被视为非负整数


指针是如何存储在C/C++中的?在其他流行语言中,从数学的角度来看,你可以说指针只是内存的索引。但是,指针不是int,因为它们可以有不同的大小。 指针以硬件指定的方式存储。在某些机器上,它可以是int,但不应该依赖于此


特别是与编程语言相关的,它们必须考虑它们所指向的对象大小,因此在查看绝对值时,算法是不同的。在这方面,它不同于简单的
int
指针变量使用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

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

这里有两个隐含问题,所以让我们来理解我所理解的每一个。 首先,C/C++中的指针只是带伪装的整数吗

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

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

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

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

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

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

一个特定的实现可以很好地采取以下措施:

p++;
意思是这样的:

i -= sizeof(element);
即反向存储空间。我不知道有任何这样的环境、计算机、运行时、编译器或诸如此类的东西可以做到这一点,但文档允许这样做


这就是您应该关心的。

这取决于实现。这取决于您的意思。指针只是一堆位(在寄存器或另一个内存位置);这些位总是可以重新解释为整数。指针存储内存地址。内存地址的形式取决于硬件。您指的是哪种具体的实现?没有规定指针必须精确为4个字节。在C/C++中,每个指针变量有4个字节来存储堆栈中的地址。int*ptr;sizeof(ptr)=4@jvra:否。反例:在我的机器上,
sizeof(int*)==8
(64位),我知道微处理器的位置是2(16位)。指针不一定是32位。
int
不一定与指针大小相同。这完全依赖于实现,当然不是。但对于一个简单的例子来说,它应该是好的。当前的x86仍然使用分段内存,但它不再那么明显,因为地址空间更大了。底层架构仍然非常相似。@Devolus,在64位模式下不再如此。实际上,32位模式不再是这样,因为操作系统将内存分配为从零开始的一个大段。操作系统分配单个32位页面是一种方便,只是一种特殊的设置。架构本身并不需要它。