我试图在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;
这里发生了什么? 谢谢!
答案 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->
引用的变体。它可能也更容易阅读。