#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。
发布于 2018-02-06 18:09:42
给定指向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)。
发布于 2018-02-06 18:06:21
指针算法使用底层类型的知识进行操作。向指针添加值时,可以添加基础类型的元素数,而不是字节数。类似地,对于两个指针的减法,差别在于元素的数量,而不是字节数。
您的指针是int *类型的。根据您的输出,int的长度似乎是4字节。所以这种类型的两个指针值相差48,在48 /4= 12 ints中实际上是不同的,这是减法的结果。
另外,将特定的数值赋值给指针会调用未定义行为,减去不指向同一个数组对象的两个指针也是如此。通过创建数组并为a和b分配以下两个元素的地址,您可以以一致的方式做到这一点:
int array[60];
int *a = &array[2];
int *b = &array[50];发布于 2018-02-06 18:00:37
首先,您不正确地初始化您的指针,这将导致未定义行为。未定义行为的行为是未指定的,因此理论上,任何事情都可能发生,例如打印值12,这可能是指针的内存差异。使用以下与运算符一起正确初始化您的指针:
int* a = new int{50};
int* b = new int{2};接下来,要打印这些值的差异,必须取消引用指针以获得它们的指向值:
printf("%d",*a-*b);https://stackoverflow.com/questions/48649192
复制相似问题