jac*_*k X 1 c++ language-lawyer
考虑这种情况,其来源自https://www.ralfj.de/blog/2018/07/24/pointers-and-bytes.html:
int main(){
auto x = new int[8];
auto y = new int[8];
y[0] = 42;
auto x_ptr = x+8; // one past the end
if (x_ptr == &y[0]){
// ...
}
}
Run Code Online (Sandbox Code Playgroud)
现在,假设 x 和 y 已被分配到彼此相邻的位置,其中 y 具有较高的地址。
根据[expr.eq] p3
比较指针的定义如下:
- 如果一个指针代表一个完整对象的地址,而另一个指针代表另一个完整对象的最后一个元素之后的地址,则比较的结果是未指定的。
- 否则,如果指针都为空,都指向同一个函数,或者都表示相同的地址,则它们比较相等。
和x都不y指向一个完整的对象,它们最初指向数组的元素,这是一个子对象。因此,第一条似乎不适用于本案。因此,第二个项目符号适用于此处,因为它紧接在最初指向的y数组之后。x那么,对比一下true,对吗?
"指向"!="代表"的地址"。在第一个项目符号中:
如果一个指针代表一个完整对象的地址......
(粗体我的)
y不“指向”一个完整的对象(它指向一个数组元素,也称为它的子对象),但y“表示”一个完整对象的地址,因为它在数字上等于整个数组的地址。
从您在评论中发布的段落中:[basic.compound]/3
指向或超过对象末尾的指针类型的值表示对象34占用的内存中第一个字节([intro.memory])的地址或对象末尾之后的内存中第一个字节的地址。分别由对象占用的存储空间。
| 归档时间: |
|
| 查看次数: |
111 次 |
| 最近记录: |