#include <iostream>
using namespace std;
int main() {
int* a = (int*)50;//printf("%d",a)-gives 50
int* b = (int*)2;//printf("%d",b)-gives 2
printf("%d",a-b);//12 is answer, but shouldnt it be 50-2=48
return 0;
}
我想知道为什么答案是12,因为它可以是50-2 = 48,或5-2 = 3.
答案 0 :(得分:4)
指针算法在知道底层类型的情况下运行。向指针添加值时,可以添加基础类型的元素数,而不是 bytes 的数量。类似地,对于两个指针的减法,差异在于元素的数量,而不是字节数。
您的指针属于int *
类型。根据您的输出,似乎int
的长度为4个字节。因此,这个类型的两个指针的值相差48实际上在48/4 = 12 int
s中有所不同。这就是减法的结果。
顺便说一句,为指针指定一个特定的数值会调用undefined behavior,就像减去两个不指向同一个数组对象的指针一样。您可以通过创建数组并为a
和b
分配其中两个元素的地址,以一致的方式执行此操作:
int array[60];
int *a = &array[2];
int *b = &array[50];
答案 1 :(得分:0)
首先,您正在错误地初始化指针,这导致undefined behavior。未定义行为的行为是未指定的,因此从理论上讲,任何事情都可能发生,例如值12的打印,这可能是指针内存的差异。使用以下new
operator来正确初始化指针:
int* a = new int{50};
int* b = new int{2};
接下来,要打印这些值的差异,您必须取消引用指针以获取其指向值:
printf("%d",*a-*b);
答案 2 :(得分:0)
给定指向T
类型对象的指针,指针与其+1之间的数字差异为sizeof(T)
。
T* p1 = <some pointer value>;
T* p2 = p1 + 1;
鉴于上述情况,
(p2 - p1)
是1
。
但是,如果您获取指针的数值,如果p1
为a1,
,则p2
将为a1 + sizeof(T)
。
假设您指向int
且sizeof(int)
为4。
a1 a2
| |
v v
+----+----+----+----+----+----+----+----+
| | | | | | | | |
+----+----+----+----+----+----+----+----+
,p1
的值是地址a1
。 p1+1
指向a1
之后的下一个整数,这意味着它将是a2
。如您所见,a1
和a2
之间的数字差异不是1而是sizeof(int)
。