首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >减除后给出不同答案的整数的c++指针

减除后给出不同答案的整数的c++指针
EN

Stack Overflow用户
提问于 2018-02-06 17:59:11
回答 3查看 56关注 0票数 0
代码语言:javascript
复制
#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。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-02-06 18:09:42

给定指向T类型对象的指针,指针与其+1之间的数值差异为sizeof(T)

代码语言:javascript
复制
T* p1 = <some pointer value>;
T* p2 = p1 + 1;

鉴于上述情况,

(p2 - p1)1

但是,如果使用指针的数值,如果p1a1,,那么p2将是a1 + sizeof(T)

假设您有一个指向int的指针,而sizeof(int)是4。

代码语言:javascript
复制
 a1                  a2
 |                   |
 v                   v
 +----+----+----+----+----+----+----+----+
 |    |    |    |    |    |    |    |    |
 +----+----+----+----+----+----+----+----+

p1的值是地址a1p1+1指向a1之后的下一个整数,这意味着它将是a2。如您所见,a1a2之间的数值差异不是1,而是sizeof(int)

票数 0
EN

Stack Overflow用户

发布于 2018-02-06 18:06:21

指针算法使用底层类型的知识进行操作。向指针添加值时,可以添加基础类型的元素数,而不是字节数。类似地,对于两个指针的减法,差别在于元素的数量,而不是字节数。

您的指针是int *类型的。根据您的输出,int的长度似乎是4字节。所以这种类型的两个指针值相差48,在48 /4= 12 ints中实际上是不同的,这是减法的结果。

另外,将特定的数值赋值给指针会调用未定义行为,减去不指向同一个数组对象的两个指针也是如此。通过创建数组并为ab分配以下两个元素的地址,您可以以一致的方式做到这一点:

代码语言:javascript
复制
int array[60];
int *a = &array[2];
int *b = &array[50];
票数 4
EN

Stack Overflow用户

发布于 2018-02-06 18:00:37

首先,您不正确地初始化您的指针,这将导致未定义行为。未定义行为的行为是未指定的,因此理论上,任何事情都可能发生,例如打印值12,这可能是指针的内存差异。使用以下与运算符一起正确初始化您的指针:

代码语言:javascript
复制
int* a = new int{50};
int* b = new int{2};

接下来,要打印这些值的差异,必须取消引用指针以获得它们的指向值:

代码语言:javascript
复制
printf("%d",*a-*b);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48649192

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档