【问题标题】:Why do we have to assign a temporary pointer to an array in a for loop?为什么我们必须在 for 循环中为数组分配一个临时指针?
【发布时间】:2020-03-03 09:07:30
【问题描述】:

我对 C++ 很陌生,我试图理解为什么我们需要为数组分配一个指针,假设数组大小就像这里循环的第一部分一样已知。

for(int * ptr = arr; ptr < arr + arrSize; ptr++)

任何帮助将不胜感激。

【问题讨论】:

  • 您也可以使用for (int i = 0; i &lt; arrSize; i++) 并使用myArr[i]。或者如果在编译时知道大小,则基于范围的for 循环。无论哪种方式,您都需要 some 类型的迭代器,无论是沿数组移动的指针、代表数组索引的 int 还是基于范围的循环在引擎盖下设置的迭代器.
  • 您不必这样做,有很多方法可以遍历数组。这将有助于澄清您的问题
  • "为什么我们需要分配一个指针" 你不需要。如果你愿意,你可以,但你不需要。

标签: c++ loops for-loop pointers pointer-arithmetic


【解决方案1】:

首先,表达式中使用的数组指示符(极少例外)被转换为指向其第一个元素的指针。

所以在这个声明中

int * ptr = arr

正在创建局部变量ptr,它将指向数组arr的第一个元素。

这个表达式

arr + arrSize

指向数组arr的最后一个元素之后的一个元素。

因此在循环内,由于指针ptr 的递增,数组的所有元素都被顺序访问,直到指针ptr 指向数组最后一个元素之后的一个元素。

这是一个演示程序。

#include <iostream>

int main() 
{
    const size_t arrSize = 5;
    int arr[arrSize] = { 1, 2, 3, 4, 5 };

    size_t i = 0;
    for ( int *ptr = arr; ptr != arr + arrSize; ptr++ )
    {
        std::cout << "ptr = " << ptr << ", &arr[" << i << "] = " << &arr[i] << '\n';
        std::cout << "*ptr = " << *ptr << ", arr[" << i << "] = " << arr[i] << '\n';
        std::cout << '\n';

        i++;
    }

    return 0;
}

它的输出可能看起来像

ptr = 0x7ffeb74dbd00, &arr[0] = 0x7ffeb74dbd00
*ptr = 1, arr[0] = 1

ptr = 0x7ffeb74dbd04, &arr[1] = 0x7ffeb74dbd04
*ptr = 2, arr[1] = 2

ptr = 0x7ffeb74dbd08, &arr[2] = 0x7ffeb74dbd08
*ptr = 3, arr[2] = 3

ptr = 0x7ffeb74dbd0c, &arr[3] = 0x7ffeb74dbd0c
*ptr = 4, arr[3] = 4

ptr = 0x7ffeb74dbd10, &arr[4] = 0x7ffeb74dbd10
*ptr = 5, arr[4] = 5

注意这个表达式中的那个

arr + arrSize

这里用到了所谓的指针算法。例如

( arr + arrSize ) - arr

给出两个指针表达式arr + arrSizearr 之间的元素arrSize 的数量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多