2

我试图std::array在 C++ 中访问给定指针的元素。这是一些说明我的问题的代码:

#include <iostream>
#include <array>

void func(std::array<int, 4> *);

int main()
{
    std::array<int, 4> arr = {1, 0, 5, 0};
    func(&arr);
}

void func(std::array<int, 4> *elements)
{
    for (int i = 0; i < 4; i = i + 1)
    {
        std::cout << *elements[i] << std::endl;
    }
}

我希望这会std::array在新行上打印的每个元素。但是,它甚至没有通过编译:

main.cpp: In function ‘void func(std::array<int, 4ul>*)’:
main.cpp:16:22: error: no match for ‘operator*’ (operand type is ‘std::array<int, 4ul>’)
         std::cout << *elements[i] << std::endl;

这里发生了什么?
谢谢!

4

3 回答 3

10

利用

std::cout << (*elements)[i] << std::endl;

反而。否则operator[]首先应用,因为它具有更高的优先级,请参阅http://en.cppreference.com/w/cpp/language/operator_precedence

因此,您首先需要取消引用指针以访问第一个指针对象,即 an array,然后使用operator[]. 否则,编译器会将您的代码解析为*(elements[i]),因此首先您获得第i-th 数组(除非 ,否则它当然不存在i==0),然后您尝试取消引用它,因此会出现编译错误。

提示:如果您担心副本,请const改为通过引用传递数组

void func(const std::array<int, 4>& elements)

那么函数内的语法将是“自然的”,即elements[i]仅表示i数组引用的第 -th 元素elements。您还将简单地将数组传递为func(arr);.

于 2015-05-30T16:34:33.910 回答
6

@vsoftco 的回答非常正确。

我想补充一点,通过引用而不是指针C++传递大对象更惯用:

#include <iostream>
#include <array>

// declare parameter as a reference
void func(std::array<int, 4>&);

int main()
{
    std::array<int, 4> arr = {1, 0, 5, 0};
    func(arr); // no need to take address
}

void func(std::array<int, 4>& elements)
{
    for (int i = 0; i < 4; i = i + 1)
    {
        // just use as normal
        std::cout << elements[i] << std::endl;
    }
}

如果函数不会修改数组,那么const 引用会更合适:

void func(const std::array<int, 4>& elements)
{
    for (int i = 0; i < 4; i = i + 1)
    {
        // just use as normal
        std::cout << elements[i] << std::endl;
    }
}
于 2015-05-30T16:46:43.000 回答
3

替代答案

虽然其他答案也是正确的,但我想建议另一种变体,因为在某些情况下重写代码以使用引用并不总是可能的:

std::cout << elements->at(i) << std::endl;

这是一种避免指针解引用(*element)但使用std::array::operator->. 它也可能更容易阅读。

于 2018-07-17T07:36:39.540 回答