c++指向整数的指针在减去时给出不同的答案

标签 c++ pointers casting reference

#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。

最佳答案

指针算法在了解底层类型的情况下进行运算。当您向指针添加一个值时,您添加的是底层类型的元素的数量,而不是字节的数量。类似地,对于两个指针的减法,区别在于元素的数量,而不是字节数。

您的指针是 int * 类型。根据您的输出,似乎 int 的长度为 4 个字节。因此,这种类型的两个值相差 48 的指针实际上相差 48/4 = 12 int。这就是减法的结果。

顺便说一句,将特定数值分配给指针会调用 undefined behavior ,减去两个不指向同一个数组对象的指针也是如此。您可以通过创建一个数组并为 ab 分配其中两个元素的地址来以一致的方式执行此操作:

int array[60];
int *a = &array[2];
int *b = &array[50];

关于c++指向整数的指针在减去时给出不同的答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48649192/

相关文章:

c++ - 是否可以确定类是否具有特定签名的模板方法

c++ - 为什么不在 GotW 54 中调整和清除作品?

iphone - Objective-c 指针

c# - C#中指向类实例的指针

c - 为什么 "const int*"可以指向一个非常量 int?

java - 为什么我需要在 byte 和 short 上显式转换 char 原语?

在 R 中使用 sum+product 进行重铸

ios - 构建 iOS 项目时出现 Google Cast 2.6.0 错误

c++ - 获取指向基类 protected 成员函数的函数指针

c++使用类成员作为模板参数