假设你有一个由
之类的东西产生的指针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位。
答案 0 :(得分:4)
将1
添加到pointer
时,编译器会在场景后面执行以下算法
pointer = pointer + sizeof(int)*1
因此,它将取决于数据类型的大小。在32位机器上,int
的大小为4字节,因此4*1 = 4
将添加到pointer
。
例如,如果pointer
指向内存地址0x00000000
,则在向其添加0x00000004
后,它将指向1
。
答案 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)?