【问题标题】:If you add 1 to a pointer, does it really add 1, or does it add 4 or 32? [duplicate]如果给指针加 1,它真的加 1,还是加 4 或 32? [复制]
【发布时间】:2015-06-09 21:40:37
【问题描述】:

假设你有一个指针,由类似的东西产生

int a = 5;
int* pointer = &a;

假设你在指针上加 1,如下所示

pointer = pointer + 1;

现在假设指针的原始按位表示是

00000000 00000000 00000000 00000000

那么新的表示是00000000 00000000 00000000 00000001?还是00000000 00000000 00000001 00000000?还是两者都没有?

我很困惑,因为我觉得给一个数字加 1 应该给它的按位表示加 1。但是如果给数组的索引加 1,新地址距离旧地址 32 位。

【问题讨论】:

  • 后者;它会在内存中移动 sizeof(int) 个字节
  • int * 移动一个字节并不常用。
  • your favorite search engine中查找“指针算法”
  • 简单的答案是:它添加了等于指针数据类型大小的字节数。如果该类型是int,则它会增加 4 或 8,具体取决于架构。
  • "我觉得给一个数字加 1 应该给它的按位表示加 1" 为什么?给一个数字加 1 应该给它的值加 1 不是更明智吗?向值的编码添加 1 几乎是您永远不想做的事情。

标签: c++ c pointers


【解决方案1】:

当您将1 添加到pointer 时,编译器会在后台执行以下算法

pointer = pointer + sizeof(int)*1  

因此,这将取决于数据类型的大小。在 32 位机器上,int 的大小为 4 字节,因此 4*1 = 4 将被添加到 pointer

例如,如果pointer 指向内存地址0x00000000,那么在添加1 后它将指向0x00000004

【讨论】:

  • 等等,会是 00000000 00000000 00000000 00000100 吗?
  • 是的。应该是00000000 00000000 00000000 00000100
【解决方案2】:

这取决于指针的类型。

就实际数据而言,指针实际上都是相同的。 int* 保留与 char* 相同类型的数据(表示内存位置的整数值)。我们关心指针指向的数据类型的原因是,除了知道如何对其进行解码(即取消引用它)之外,还要知道如何指向相同类型的下一个元素。所以,让p 是一个指向T 类型的对象(不是在oop 中的对象,而是任何具有一些关联存储的变量)的指针。然后,intptr_t(p + 1) = intptr_t(p) + sizeof(T)

这在处理数组时特别有用,如果您稍微思考一下,它就会说得通。考虑声明 int *p = 0x100 并假设地址 100 是一个有效的整数值。从 0x101 访问整数值有什么意义(这实际上是非法的,因为整数必须从可被 4 整除的地址开始 - 考虑到 sizeof(int) = 4)?

【讨论】:

  • 谢谢,这提供了很好的直觉。
猜你喜欢
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 2019-06-26
  • 2011-10-03
  • 2013-05-10
  • 2012-02-15
  • 1970-01-01
相关资源
最近更新 更多