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

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

本文关键字:定指 指针 元素 数组 std C++ 访问      更新时间:2023-10-16

我正试图访问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)

然后,函数中的语法将是"自然"的,即elements[i]将简单地表示数组引用elements的第i个元素。您还将简单地将数组作为func(arr);传递。

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

如果函数不会修改数组,则常量引用将更合适:

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->的变体。它也可能更容易阅读。