我有以下问题;如果a是一个带有10个元素的int数组,我可以定义指针
int*b=&a[3];
int*c=&[2];
然后我可以使用像int d=a-c;
这样的指针进行算术运算,它将返回b和c之间数组中int值的数量。所以我的问题是,如果我也被允许对任何可能不在数组中的变量进行这样的指针算术运算。例如:
int a=10;
int b=20;
int*c=&a;
int* d=&b;
然后执行int e=d-c;
或int*e=c+1;
我问的原因是我收到了有关这是否会导致未定义行为的相互矛盾的信息,
答案 0 :(得分:5)
[expr.add]标准草案:
当向指针添加或从指针中减去具有整数类型的表达式时,结果具有类型 指针操作数。如果表达式P指向具有n个元素的数组对象x的元素x [i],则 86 表达式P + J和J + P(其中J具有值j)指向(可能是假设的)元素 x [i + j]如果0≤i+j≤n;否则,行为未定义。同样,表达式P - J指向 (可能是假设的)元素x [i - j]如果0≤i - j≤n;否则,行为未定义。
- 醇>
当减去指向同一数组对象元素的两个指针时,结果的类型为a 实现定义的有符号整数类型;此类型应与定义为std :: ptrdiff_-的类型相同 标题中的t(21.2)。如果表达式P和Q分别指向元素x [i]和x [j] 在相同的数组对象x中,表达式P-Q具有值i-j;否则,行为未定义。 [注意:如果值i-j不在std :: ptrdiff_t类型的可表示值范围内,则行为为 未定义。 - 尾注]
86)为此目的,不是数组元素的对象被认为属于单元素数组;见8.3.1。一个 超过n个元素的数组x的最后一个元素的指针被认为等同于指向假设元素的指针 x [n]为此目的;见6.9.2。
c+1
定义明确,因为它会指向一个超过单元素阵列的#34;变量被视为引用规则的目的,因此满足0 ≤ 0 + 1 ≤ 1
。但它没有很好地定义为间接指针,因为它超过了#34;数组&#34 ;.
d-c
有未定义的行为。