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)
这里发生了什么?
谢谢!
使用
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);
.
@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)