3

是否明确定义在指向指针的指针上使用指针算术?例如

int a=some_value;
int* p=&a;
int**p2=&p;

现在对 p2 执行算术是否是明确定义的行为?(例如 p2+1、p2+2 等)

4

2 回答 2

3

另一个答案是完全错误的:

int *p = &a;

声明一个指针变量(不是指针数组)。这是等效的,WRT 索引,具有单个元素的数组:

int *(array[1]) = { &a };

所以你可以做(&array[0]) + 1or array + 1, or p + 1,因为允许形成一个过去的指针:一个过去的指针指向一个假想的元素,它就在数组的末尾。one-past-the-end 指针不可解引用,因为它不指向真实对象。

但是您无法计算任何其他指针值

特别p+2无效

于 2011-11-27T12:52:26.460 回答
1

当然!

p + n

wherep是一个指针并且n是一个整数总是明确定义的。它从自身产生地址,该地址是“p 指向的元素类型大小的 n 倍”字节p。在这种情况下p2是一个指向指针的指针。p2 + 4过去的地址“4 * the-size-of-pointers”字节也是如此p2

由于您在特定示例中指向局部变量,因此这很奇怪。但这不会是非法的。

于 2011-10-06T06:35:28.130 回答