您能否在此程序中解释array + 5的目的?

Sam*_*son 6 c++ arrays pointer-arithmetic

我了解它的大部分工作原理,除了main函数中的第二行:int* end = array+5;。那条线是如何工作的?

#inlcude <iostream>
int main()
{
    int array[] = {10, 20, 29, 200, 2};

    int* end = array+5;
    for(int* it = array; it != end; ++it)
    {
        std::cout << *it << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

应该只打印列表中的每个元素。

Mic*_*kis 9

it != end;
Run Code Online (Sandbox Code Playgroud)

表示它到达位置[5],该位置在最后一个(4)之后。

int* end = array + 5; 
Run Code Online (Sandbox Code Playgroud)

只需创建一个指向该[5]位置的变量即可。

它可以工作,但是更干净,更安全的版本是:

for(int i = 0 ; i < 5 ; i++)
{
    std::cout << it[i] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

当然,您可以将硬编码5替换为sizeof(array)/sizeof(int),或者甚至更好地使用std :: array。

std::array arr<int,5> = {10, 20, 29, 200, 2};
for(int i = 0 ; i < arr.size() ; i++)
{
    std::cout << arr[i] << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

要么

 std::array arr<int,5> = {10, 20, 29, 200, 2};
 for(auto& it : arr)
 {
    std::cout << it << std::endl;
 }
Run Code Online (Sandbox Code Playgroud)

后者的形式与原始数组一样快,但是更安全。

  • 后两种形式也可以在c样式数组上使用(第一种情况为`std :: size(arr)`) (3认同)

fiz*_*ear 7

该变量array就像是指向包含数据的内存开头的指针。

的长度array5,因此在开头加上5会得出结尾处1的位置。

start --|  
       10, 20, 29, 200, 2, (out of array)
        |--- +5 -----------^
Run Code Online (Sandbox Code Playgroud)

条件it != end检查循环是否没有超出范围。