在C ++中将数组作为函数参数传递

时间:2014-11-17 19:33:08

标签: c++ arrays function arguments

如果我有这个功能:

void initPoints(sf::Vector2f points[]);

为什么我可以这样做:

sf::Vector2f[] vecs = {sf::Vector2f(0,0), etc};
initPoints(vecs);

但是不能这样做吗?

initPoints({sf::Vector2f(0,0), etc});

VS给我第二个错误,但不是第一个错误。

2 个答案:

答案 0 :(得分:3)

使用std::vectorstd::array,您可以更轻松地解决问题:) 此外,std::vector符合RAII标准,因此您无需自己管理内存。通常,STL类比C类数组好。

#include <vector>
#include <initializer_list>
// ...
std::vector<sf::Vector2f> vecs = { Vector2f(0,0), etc };

然后:

initPoints(const std::vector<sf::Vector2f>& vec) {
    // ...
}
initPoints(vecs);

答案 1 :(得分:1)

C ++通常不允许您将实际数组作为函数参数传递。它有一个方便的功能,让你认为这是可能的,因为你可以实际传递一个指针。

换句话说:

void initPoints(sf::Vector2f points[]);

相同
void initPoints(sf::Vector2f* points);

请注意,initPoints不知道points的长度,因此通常您也会传递一个长度参数:

void initPoints(sf:Vector2f* points, size_t length);

你想要做的只是在C ++ 11之前无效。在C ++ 11中,您可以重载initPoints()以获取std::initializer_list<sf::Vector2f>,语法将正常工作。


您正在使用的数组类型通常称为“C风格数组”。它存在于C中,从一开始就存在于C ++中。它有各种限制,例如你刚刚遇到的问题。看起来你真的想要std::vector。使用std::vector有一些细微差别,我不知道你对C ++的理解程度,所以我不知道这些短语“通常你不想按价值传递它们”或“我会建议你模仿STL函数并传递开始/结束迭代器而不是“对你有意义。您最终会遇到使这些语句有用的语言部分。你现在不需要担心它们。