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

Qua*_*ool 1 c++ pointers compiler-errors function stdarray

我试图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;
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这可以打印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;
Run Code Online (Sandbox Code Playgroud)

这里发生了什么?
谢谢!

vso*_*tco 8

使用

std::cout << (*elements)[i] << std::endl;
Run Code Online (Sandbox Code Playgroud)

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

所以你首先需要取消引用指针来访问第一个指针,这是一个array,然后随后访问数组operator[].否则你的代码会被编译器解析为*(elements[i]),所以首先你得到i-th数组(当然除非这个数组不存在i==0),然后你尝试取消引用它,因此编译错误.

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

void func(const std::array<int, 4>& elements)
Run Code Online (Sandbox Code Playgroud)

然后你在函数内部的语法将是"自然的",elements[i]即将简单地表示i数组引用的第th个元素elements.你也可以简单地传递数组func(arr);.


Gal*_*lik 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

如果函数不会修改数组,则使用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;
    }
}
Run Code Online (Sandbox Code Playgroud)