C++ 从整数中减去指针 int*p=新的int; INTA=10; cout

C++ 从整数中减去指针 int*p=新的int; INTA=10; cout,c++,pointers,subtraction,pointer-arithmetic,C++,Pointers,Subtraction,Pointer Arithmetic,就指针算法而言,指针并不等同于“表示某个地址的整数”。即使是添加也不是那么简单: 不能将指针添加到指针 写入p+1并不意味着“从p变量中获取地址值并将其增加1”。实际地址增量量取决于所指变量的大小,因此递增int64\u t*p将给出与递增int8\u t*p不同的结果 为什么指针的加法和减法会有这种“奇怪的行为”?简单的答案:因为它在C++标准中定义了: 5.7加法运算符 对于加法,两个操作数都应具有算术或非范围枚举类型,或者一个操作数应为 指向完全定义的对象类型的指针,另一个应具有 整型

就指针算法而言,指针并不等同于“表示某个地址的整数”。即使是添加也不是那么简单:

  • 不能将指针添加到指针
  • 写入
    p+1
    并不意味着“从p变量中获取地址值并将其增加1”。实际地址增量量取决于所指变量的大小,因此递增
    int64\u t*p
    将给出与递增
    int8\u t*p
    不同的结果
为什么指针的加法和减法会有这种“奇怪的行为”?简单的答案:因为它在C++标准中定义了:

5.7加法运算符

对于加法,两个操作数都应具有算术或非范围枚举类型,或者一个操作数应为 指向完全定义的对象类型的指针,另一个应具有 整型或非作用域枚举类型

对于减法,以下其中一项应适用:

-两个操作数都具有算术或非范围枚举类型;或

-两个操作数都是指向同一完全定义对象类型的cv限定或cv非限定版本的指针;或

-左操作数是指向完全定义的对象类型的指针,右操作数具有整数或无范围枚举类型

但这一限制背后有一个原因(实际上在标准的同一页上有描述)。指针算法用于以下用途:如果
p
指向数组中的某个元素,
p+1
指向下一个元素,
p-1
指向上一个元素,
p1-p2
显示p1和p2之间的元素数。在这些术语中,
p1+p2
没有任何意义,与
1-p
相同,因此它们被视为语法错误

    int *p = new int; 
    int a = 10; 
    cout << a+p;
    cout << a-p;