从整数中减去指针
Subtracting pointer from an integer
int *p = new int;
int a = 10;
cout << a+p;
cout << a-p;
打印a+p,p+a,p-a会给出一个地址,但a-p会给我一个错误。为什么会这样?指针地址不是整数吗?如果是的话,a-p不应该给我一个负值吗?
就指针算术而言,指针并不等同于"表示某个地址的整数"。即使添加也没那么简单:
- 不能将指针添加到指针
- 写入
p+1
并不意味着"从p变量中获取地址值并将其增加一"。实际的地址增量取决于指向变量的大小,因此递增int64_t *p
会得到与递增int8_t *p
不同的结果
为什么我们对指针的加法和减法有这样的"奇怪行为"?简单的答案:因为它在C++标准中是这样定义的:
5.7加法运算符
对于加法,两个操作数都应具有算术或无范围枚举类型,或者一个操作数应为指向完全定义的对象类型的指针,而另一个应具有整型或无范围枚举类型。
对于减法,应符合以下条件之一:
--两个操作数都具有算术或非范围枚举类型;或
--两个操作数都是指向相同完全定义的对象类型的cv限定或cv不限定版本的指针;或
--左操作数是指向完全定义的对象类型的指针,而右操作数具有整型或非量程枚举类型。
但这一限制背后有原因(实际上在标准的同一页上有描述)。指针算术用于以下用途:如果p
指向数组中的某个元素,则p+1
指向下一个元素,p-1
指向上一个元素并且p1-p2
显示p1和p2之间的元素数。在这些术语中,p1+p2
没有任何意义,1-p
也是如此,因此它们被视为语法错误。
相关文章:
- 整数键映射到头文件中的成员函数指针
- 如何实现容纳整数和无效指针的双向链表?
- 使用指针将 ASCII 值添加到整数
- 如果整数与指针大小相同,则重新解释将整数转换为指针双射是否具有双射作用?
- 在C++中,如果我可以直接将整数分配给指针而不使用"new",为什么要使用"new"?
- 取消引用指向整数的指针时获得不同的结果
- 为什么此指针值不能转换为整数的规则是什么?
- 禁止指针和整数之间的比较C++
- 为什么在将 void 指针转换为整数指针时出现分段错误
- ISO C++禁止指针和整数 [-fpermissive] [c++] 之间的比较
- 指向整数数组和打印总和的指针
- 将uint64_t转换为字节时从不同大小的整数强制转换为指针
- Qt 错误 iso c++ 禁止指针和整数之间的比较 -permissive
- 如何在 c++ 中动态声明指向整数的指针数组?
- C++:这是使用整数变量作为函数调用指针的正确方法吗
- 如何在满足常量表达式的同时将整数传递给指针,传递给 std::array<double、integer>?
- 创建<int>对整数数组指针的矢量引用 (C++)
- 整数指针数组的元素是否可以指向整数数组?
- 将指针整数(int**)转换为c中的String
- 为什么此指针/整数比较会生成分段错误