是否明确定义在指向指针的指针上使用指针算术?例如
int a=some_value;
int* p=&a;
int**p2=&p;
现在对 p2 执行算术是否是明确定义的行为?(例如 p2+1、p2+2 等)
是否明确定义在指向指针的指针上使用指针算术?例如
int a=some_value;
int* p=&a;
int**p2=&p;
现在对 p2 执行算术是否是明确定义的行为?(例如 p2+1、p2+2 等)
另一个答案是完全错误的:
int *p = &a;
声明一个指针变量(不是指针数组)。这是等效的,WRT 索引,具有单个元素的数组:
int *(array[1]) = { &a };
所以你可以做(&array[0]) + 1
or array + 1
, or p + 1
,因为允许形成一个过去的指针:一个过去的指针指向一个假想的元素,它就在数组的末尾。one-past-the-end 指针不可解引用,因为它不指向真实对象。
但是您无法计算任何其他指针值。
特别p+2
是无效。
当然!
p + n
wherep
是一个指针并且n
是一个整数总是明确定义的。它从自身产生地址,该地址是“p 指向的元素类型大小的 n 倍”字节p
。在这种情况下p2
是一个指向指针的指针。p2 + 4
过去的地址“4 * the-size-of-pointers”字节也是如此p2
。
由于您在特定示例中指向局部变量,因此这很奇怪。但这不会是非法的。