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