如何在C++中访问std::数组中给定指针的元素
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)
然后,函数中的语法将是"自然"的,即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->
的变体。它也可能更容易阅读。
相关文章:
- 将常量指针引用绑定到非常量指针
- 运行时错误:引用绑定到类型为"int"的空指针
- 创建一个函数的 Python 绑定,返回指向带有 boost 的向量的指针
- 与简单地创建派生类指针相比,将基类绑定到派生类有什么优点?
- 获取具有静态局部变量的绑定/推断捕获 lambda 的函数指针
- 努力将指向成员函数的指针绑定到类模板的T成员,然后在槽中调用
- 将引用绑定到指针的语法是什么?(各种)
- 为什么 VS 无法将右值引用绑定到指针?
- 使用 python 绑定来检查 C++ 类型是否是规范方式的指针、引用等?
- 函数参数绑定通过参考与传递指针传递数组的规则
- 排序时引用绑定到 'value_type' 类型的 null 指针
- PyBind11:绑定使用双指针的函数
- C++绑定函数到指针
- 如何破坏包含自指指针的对象
- const自动参考绑定到(NULL)指针 - 实际类型是什么
- 如何将函数指针传递给绑定
- 指向成员的指针如何知道它绑定了哪个成员
- RValue 引用在将其绑定(非指针)对象分配给另一个指针后是否会删除该对象?
- 取消绑定此指针有什么问题
- 为什么 GCC 5.3.0 在将引用绑定到指针时发出警告"this"