如何在 C++ 中访问给定指针的 std::array 的元素
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)
那么函数内部的语法将是 "natural",即 elements[i]
将简单地表示数组引用 elements
的第 i
个元素。您还可以将数组简单地传递为 func(arr);
.
@vsoftco的回答很正确
我只想补充一点,在 C++
中,通过 reference 传递大对象比 pointer[=24] 更惯用=]:
#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;
}
}
备选答案
虽然其他答案也正确,但我想建议另一种变体,因为在某些情况下重写代码以使用引用并不总是可行的:
std::cout << elements->at(i) << std::endl;
这是一个避免指针取消引用 (*element)
但使用 std::array::operator->
的变体。它也可能更容易阅读。
我正在尝试访问一个 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)
那么函数内部的语法将是 "natural",即 elements[i]
将简单地表示数组引用 elements
的第 i
个元素。您还可以将数组简单地传递为 func(arr);
.
@vsoftco的回答很正确
我只想补充一点,在 C++
中,通过 reference 传递大对象比 pointer[=24] 更惯用=]:
#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;
}
}
备选答案
虽然其他答案也正确,但我想建议另一种变体,因为在某些情况下重写代码以使用引用并不总是可行的:
std::cout << elements->at(i) << std::endl;
这是一个避免指针取消引用 (*element)
但使用 std::array::operator->
的变体。它也可能更容易阅读。