如何在C ++中给出它的指针访问std :: array的元素

时间:2015-05-30 16:33:23

标签: c++ function pointers compiler-errors stdarray

我试图在C ++中使用它的指针来访问std::array的元素。这里有一些代码可以解释我的问题:

#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;

这里发生了什么? 谢谢!

3 个答案:

答案 0 :(得分:8)

使用

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

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

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

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

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

然后你在函数中的语法将是&#34;自然&#34;,即elements[i]将简单地表示数组引用i的{​​{1}} - 元素。您还可以将数组简单地作为elements传递。

答案 1 :(得分:5)

@ 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 reference 会更合适:

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;
    }
}

答案 2 :(得分:3)

替代答案

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

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

这是一个避免使用指针(*element)而取消指针std::array::operator->引用的变体。它可能也更容易阅读。