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

How to access an element of an std::array given its pointer in C++

我正在尝试访问一个 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;

这是怎么回事?
谢谢!

使用

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)

那么函数内部的语法将是 "natural",即 elements[i] 将简单地表示数组引用 elements 的第 i 个元素。您还可以将数组简单地传递为 func(arr);.

@vsoftco的回答很正确

我只想补充一点,在 C++ 中,通过 reference 传递大对象比 pointer[=24] 更惯用=]:

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

备选答案

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

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

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