如果你向指针添加1,它真的添加1,还是添加4或32?

时间:2015-06-09 21:40:37

标签: c++ c pointers

假设你有一个由

之类的东西产生的指针
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位。

2 个答案:

答案 0 :(得分:4)

1添加到pointer时,编译器会在场景后面执行以下算法

pointer = pointer + sizeof(int)*1  

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

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

enter image description here

答案 1 :(得分:2)

这取决于指针的类型。

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

这对于使用数组特别有用,如果你想一点,它是有道理的。考虑声明int *p = 0x100并假设地址100是有效的整数值。从0x101访问整数值会有什么意义(这实际上是非法的,因为int必须从可被4整除的地址开始 - 考虑到sizeof(int)= 4)?