是C / C ++中的指针(或任何语言),整数?指针保存一个内存地址,从0到内存的上限。所以在数学术语中,指针可以被认为是非负整数。
如何将指针存储在C / C ++中?还有其他流行的语言?
答案 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个字节将其地址存储在堆栈中,但是在堆上保持一个位置和跟踪内存,这是附加引用的位置,表示引用可以跟内存空间一样大的内存可用的电脑