是&a [n]有效,其中n是数组的大小?

Nei*_*irk 2 c++ language-lawyer

请考虑以下简单代码对数组进行排序.

int myarray[4] = {};
std::sort(myarray, myarray + 4);
Run Code Online (Sandbox Code Playgroud)

我知道创建一个指向C风格数组末尾的指针是有效的.

我最近看过这样的代码:

std::sort(myarray, &myarray[4]);
Run Code Online (Sandbox Code Playgroud)

我不确定这是否有效,因为它取消引用数组边界之外的元素,即使元素值不用于任何东西.

这是有效的代码吗?

Tim*_*lds 7

A[i]在语法上等同于*(A + i)数组或指针A.
所以,&A[i]在语法上等同于&(*(A + i)).

*(A + i)没有未定义的行为时,&(*(A + i))将表现得相同A + i.

问题是myarray[4]在语法上等同于*(myarray + 4),从数组的边界取消引用位置.根据标准,这是未定义的行为.

所以,你应该绝对喜欢myarray + 4&myarray[4]-后者是不确定的行为.

&myarray[4]具有" 正确 "行为,大多数(如果不是全部)编译器不会根据标准免除未定义的行为.

  • @TimothyShields说谁?不是C++标准. (2认同)
  • @TimothyShields在那种情况下`p == q`但这与OP的情况不同,因为`*p`在你的例子中是有效的. (2认同)