假设我们有类似的东西
char ch;
我们取地址:
char *p = &ch;
所以我们有一个指向char
. 我们确信它是有效的。但是我们可以把它看作是一个指向一个元素的数组的指针吗?是的,这似乎是合乎逻辑的,但出现了一个有趣的观点:
如果表达式 P 指向数组对象的一个元素,而表达式 Q 指向同一数组对象的最后一个元素,则指针表达式 Q+1 比较大于 P。
如果我们说这个指针可以被认为是一个指向长度为 1 的数组的指针,那么这条标准意味着我们有权期望
assert(p < p + 1);
这实质上意味着任何有效指针都可以增加 1 并获得比前一个更大的数字(没有溢出)。标准能保证这一点吗?
对于 char,有 2 个有趣的地址 0x7FFFFFFF 和 0xFFFFFFFF - 如果 4 字节(对于 8 字节有类似的数字 - 本质不变)指针由带符号类型表示,则它们中的第一个将溢出,并且第二 - 如果未签名。我希望指针是无符号的,并且-1
- 一个未使用的保留地址,但标准中可能没有关于此的内容。但是如果你仔细想想,对于其他数据类型,increment 会增加指针类型的大小,而不是增加 1,所以地址会稍微小一些。但同样,数据将不得不影响这些地址之一。
C++
basic.compound/3:
表达式/ 复合表达式 / 一元表达式 / 一元运算符 / 3 给出了一个例子:
C 采用了类似的方法。
6.5.6 加法运算符 / 7:
6.5.6 加法运算符 / 8:
6.5.8 关系运算符/4:
让我从这里给你摘录几段。
另一个答案
简而言之,该标准并不限制您增加指针,但它不能保证任何事情,有很多依赖项,特定的操作系统,特定的编译器实现,所有这些都各不相同。
并且简单地检查了您的比较示例。在边界处为 p 设置一个值并递增我不认为这是非法的。现实中能不能得到这样的p值是另外一回事。