在“使用数组时”中使用的准确描述是什么?

时间:2018-02-12 14:30:51

标签: c++ arrays loops pointers

  

当我们使用数组时,它会自动转换为指向它的指针   第一要素。 (c ++ primer 5th ed.pp129)

int ia[3][4];

for (auto p = ia; p!= ia + 3; ++pp){
  for (auto q = *p; q ! = *p + 4; ++q)
     cout << *q << ' ';
  cout << endl;
}

上面的代码片段是报价的一个很好的例子。 p是一个指针指向一个包含四个整数的数组q是一个指针指向int

然而,基于范围的循环具有不同的故事

for (auto row: ia) // the code won't compile in fact 
  for (auto col: row) 

这里,row的类型是指针指向int (因为第二个循环不会编译)。这是为什么?这不是使用数组的情况吗?

2 个答案:

答案 0 :(得分:3)

&#34;使用数组&#34;是一个非常粗糙的表达。

要了解数组的使用方式,首先必须了解基于for循环的范围。让我们扩展你的外部循环以使用等效的常规for循环(我已经简化了一点):

{
    for (auto __begin = std::begin(ia), __end = std::end(ia);
            __begin != __end; ++__begin) {
        auto row = *__begin;

        for (auto col: row); // oops. Cannot use range-for with a pointer
    }
}

这里的问题是,推导出的auto row类型是什么?

*__begin的结果是&#34; 4个整数和#34;的数组的l值。 auto遵循模板参数推导的规则。参数不能是数组对象,因此auto永远不能推断为数组。数组类型衰减到指向第一个元素的指针,即在这种情况下指向int的指针。

一个参数可以推断为&#34;引用4个整数的数组&#34;,所以这将起作用:

for (auto& row: ia)
    for (auto col: row) 

答案 1 :(得分:2)

此处的问题是for (auto row: ia)导致ia的元素衰减为指针,因此row成为指针类型。这意味着您无法使用for (auto col: row),因为没有为指针定义开始函数。

您需要做的是参考,以便您参考1d数组而没有指向它的指针。看起来像是

for (auto& row: ia) // reference to each row in the array
    for (auto col: row) // copy of each element in the row