读C++标准系列 - 5.6~5.15 双目运算符(指针运算)

返回目录

5.7 + -
对于涉及指针的算术运算,标准中有比较严格的限制条件:
参与运算的指针必须指向数组对象中的元素,或者指向数组对象最后一个元素的下一个元素(这是STL中能够使用distance(v.begin(),v.end())计算元素个数的前提条件)。
(注:对于指向普通对象的指针,可以将该对象当成长度为1的数组中的元素)(5.7-4)
否则,会导致未定义的行为。

指针加减一个整型类型,相当于对指针对应的数组元素的下标进行加减操作。
如果数组有N个元素,只要计算得到的下标在[0,N]之间,结果都是有效的,而且保证不会溢出,否则结果是未定义的。(5.7-5)

两个指针相减,相当于对两个指针对应的数组元素的下标相减(5.7-6)
结果的类型是std::ptrdiff_t(在<cstddef>头文件中)。ptrdiff_t具体是什么类型是实现相关的,不过必然是有符号整型。
如果相减的结果溢出,那么会导致未定义的行为。

对指针进行+0或者-0的操作不会对指针的值产生影响。(5.7-7)
如果两个指针指向数组对象中的同一个元素,或者都是NULL,那么两者相减将得到0

5.9~5.10 < > == !=
因为只有指向相同类型的指针才能够进行比较,所以当指针参与比较运算的时候,会进行默认的指针类型转换(0->(T *)0,T *->void *,Derived *->Base *,T *->T const *等等)(4.10&4.4),以使两者的类型一致。

void *p;
const int *q;
int **pi;
const int *const *pci;
p <= q; // both converted to const void * before comparison
pi <= pci; // both converted to const int * const * before comparison

指针比较遵循以下的原则:

1、如果两者都是NULL,则相等
2、如果仅其中之一是NULL,则不相等
3、如果两个指针满足前面指针的算术运算的要求,那么比较的结果取决于它们指向元素的下标
4、如果两个成员函数指针对应同一个对象的同一个函数(不能是虚函数),那么两者相等
(在下面的例子中,pdl指向的对象是L的基类B,pdr指向的对象是R的基类B,两个对象并不不同,所以返回false:
struct B {
    int f();
};
struct L : B { };
struct R : B { };
struct D : L, R { };

void Test()
{
    int (B::*pb)() = &B::f;
    int (L::*pl)() = pb;
    int (R::*pr)() = pb;
    int (D::*pdl)() = pl;
    int (D::*pdr)() = pr;
    bool x = (pdl == pdr); // false
}

5、如果两个指针指向同一个对象(非union)的非静态成员变量,那么它们的大小关系取决于它们声明的顺序
(注:必须是在同一个访问权限标识符下,否则标准没有规定返回值
(换句话说,对于在不同访问权限标识符中定义的变量,具体的实现有权自由安排它们的顺序。这点需要额外小心,特别是在构造函数的初始化列表中使用这些成员时)
在下例中,a必然在b的前面,而c和a、b的位置关系则取决于具体的实现:
public A
{
    int a;
    int b;
private:
    int c;
};

6、如果两个指针指向同一个union中的成员变量,那么两者是相等的
7、对于其它情况,标准没有规定比较的结果
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值