Pointers 指向指针的指针等的指针算术

Pointers 指向指针的指针等的指针算术,pointers,pointer-arithmetic,Pointers,Pointer Arithmetic,在指针到指针的指针上使用指针算法是否定义良好? 乙二醇 现在,在p2上执行算术是否是定义良好的行为?(例如p2+1、p2+2等)当然 p + n 其中,p是一个指针,n是一个整数,这两个变量总是定义良好的。它产生的地址是p本身的“n倍元素类型p指向”字节的大小。在本例中,p2是指向指针的指针。因此p2+4是地址“4*指针大小”字节超过p2 由于您在特定示例中指向局部变量,因此这将是一个奇怪的问题。但这并不违法。另一个答案是完全错误的: int *p = &a; 声明一个单个指针变量(

在指针到指针的指针上使用指针算法是否定义良好? 乙二醇

现在,在p2上执行算术是否是定义良好的行为?(例如p2+1、p2+2等)

当然

p + n
其中,
p
是一个指针,
n
是一个整数,这两个变量总是定义良好的。它产生的地址是
p
本身的“n倍元素类型p指向”字节的大小。在本例中,
p2
是指向指针的指针。因此
p2+4
是地址“4*指针大小”字节超过
p2


由于您在特定示例中指向局部变量,因此这将是一个奇怪的问题。但这并不违法。

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

int *p = &a;
声明一个单个指针变量(不是指针数组)。这相当于WRT索引,具有一个包含单个元素的数组:

int *(array[1]) = { &a };
因此,您可以执行
(&array[0])+1
array+1
p+1
,因为允许在结束指针上形成一个过去的值:结束指针上的一个过去的值指向数组结束后的虚拟元素。超过结束指针的指针是不可取消引用的,因为它不指向实际对象

但是不能计算任何其他指针值


特别是,
p+2
是无效的。

不确定完全错误是什么意思。另一个答案从未声称p被定义为指针数组。事实上,“数组”这个词从未出现过。无论如何,
p+n
的语义对于指针
p
和整数
n
都有很好的定义。当然,操作可能有故障,但这与问题无关。同样,这个问题和另一个答案根本没有提到数组。“事实上,“数组”这个词从来没有出现过。”这就是它错误的原因:如果没有数组,就没有“定义良好的”指针算法。指针算法是在数组上定义的。我的猜测是,我们对定义良好的数组的含义存在分歧。第6.4节中提到“可以添加整数和指针”,第7.4.1节解释了发生的情况。C参考手册也没有提到数组。它只是简单地说,您可以在计算出的地址获取内存中的任何数据。对我来说,手册指定了一个定义良好的操作,但从未提及单词数组。因此,我们的分歧是基于定义明确的术语,而我们对此的解释不同。干杯。:)@Ray guess应该会有帮助…很好的链接,@zuselegacy。
p+2
的结果当然是未定义的,即使行为(即,将地址添加到字节数乘以sizeof(int))定义良好。
int *(array[1]) = { &a };