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

在C++中传递数组作为函数参数,c++,arrays,function,arguments,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在第二个问题上给了我一个错误,但在第一个问题上没有。通过使用std::vector或std::array,您可以更轻松地解决问题: 此外,st

如果我有这个功能:

void initPoints(sf::Vector2f points[]);
为什么我可以这样做:

sf::Vector2f[] vecs = {sf::Vector2f(0,0), etc};
initPoints(vecs);
但是不能这样做吗

initPoints({sf::Vector2f(0,0), etc});
VS在第二个问题上给了我一个错误,但在第一个问题上没有。

通过使用std::vector或std::array,您可以更轻松地解决问题: 此外,std::vector是符合RAII的,因此您不必自己管理内存。通常,STL类比C型数组好

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

通过使用std::vector或std::array,您可以更轻松地解决问题: 此外,std::vector是符合RAII的,因此您不必自己管理内存。通常,STL类比C型数组好

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


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

换言之:

void initPoints(sf::Vector2f points[]);
是同一件事吗

void initPoints(sf::Vector2f* points);
请注意,initPoints不知道点的长度,因此通常还传递一个长度参数:

void initPoints(sf:Vector2f* points, size_t length);
您试图做的事情在C++11之前是无效的。在C++11中,您可以重载initPoints以获取std::initializer_列表,语法将正常工作


您正在使用的数组类型通常称为C样式数组。它存在于C中,从一开始就存在于C++中。它有各种各样的限制,比如你刚刚遇到的问题。看起来你真的想要一个。使用STD::向量有一些细微差别,我不知道C++的理解水平,所以我不知道这些短语通常不想通过值传递,或者我建议你模仿STL函数,而传递开始/结束迭代器,而不是对你意味着什么。你最终会发现语言中使这些语句有用的部分。您现在不必担心它们。

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

换言之:

void initPoints(sf::Vector2f points[]);
是同一件事吗

void initPoints(sf::Vector2f* points);
请注意,initPoints不知道点的长度,因此通常还传递一个长度参数:

void initPoints(sf:Vector2f* points, size_t length);
您试图做的事情在C++11之前是无效的。在C++11中,您可以重载initPoints以获取std::initializer_列表,语法将正常工作


您正在使用的数组类型通常称为C样式数组。它存在于C中,从一开始就存在于C++中。它有各种各样的限制,比如你刚刚遇到的问题。看起来你真的想要一个。使用STD::向量有一些细微差别,我不知道C++的理解水平,所以我不知道这些短语通常不想通过值传递,或者我建议你模仿STL函数,而传递开始/结束迭代器,而不是对你意味着什么。你最终会发现语言中使这些语句有用的部分。您现在不必担心它们。

因为函数参数sf::Vector2f points[]实际上意味着sf::Vector2f*点。这是一种语法上的奇怪语言。你用的是哪种编译器?我并不想难为你:你想要使用的代码在C++11中是错误的,原因与在早期版本的语言中稍有不同,但是可以添加一个重载来修复C++11中的代码。毕竟,编译器给你的错误是什么???@Fly{a,b,C}不是数组。它是一种特殊的初始值设定项,可用于初始化数组。但它不能用于初始化指针。正如我在第一篇评论中所说,函数的参数是指针。int*是指向int的指针。仅此而已。它可以从C++中获得指针运算,这样你就可以使用一个指针来访问int旁边的int,这意味着你几乎可以把int指针当作int数组。这是非常混乱和危险的,你很快就会学会避免它,并使用具有更好定义语义的类型。因为函数参数sf::向量2f点[]真正的意思是sf::Vector2f*点。这是一种语法上的奇怪语言。你用的是哪种编译器?我并不想难为你:你想要使用的代码在C++11中是错误的,原因与在早期版本的语言中稍有不同,但是可以添加一个重载来修复C++11中的代码。毕竟,编译器给你的错误是什么???@Fly{a,b,C}不是数组。它是一种特殊的初始值设定项,可用于初始化数组。但它不能用于初始化指针。正如我在第一篇评论中所说,函数的参数是指针。int*是指向int的指针。仅此而已。从C++中得到指针运算,所以你可以使用一个int指针来访问它旁边的int,这意味着你几乎可以把int指针当作int数组。这是非常混乱和危险的,你很快就会学会避免它,并使用具有更好DEF的类型。
谢谢你的回答。实际上我已经试过使用std::vector,但我需要的是能够在一行中初始化数组/向量,因为我真正的问题是我有一个扩展超类的类,我正在调用超类构造函数-我的超类的构造函数需要数组/向量/任何东西,我不能先为这个向量/数组创建一个变量,所以我需要在一行中完成。我这样问我的问题,因为我发现它实际上很有趣,为什么这不可能,以及如何解决它。类似这样的东西:基类::基类:超类std::向量{Vector2f0,0,等等}{}?谢谢你的回答。实际上我已经试过使用std::vector,但我需要的是能够在一行中初始化数组/向量,因为我真正的问题是我有一个扩展超类的类,我正在调用超类构造函数-我的超类的构造函数需要数组/向量/任何东西,我不能先为这个向量/数组创建一个变量,所以我需要在一行中完成。我这样问我的问题,因为我发现它实际上很有趣,为什么这不可能,以及如何解决它。类似这样的东西:基类::基类:超类std::向量{Vector2f0,0,等等}{}?使用也不例外。void initPointssf::Vector2f[3]个点;在语法上是无效的。和void initPointssf::Vector2f points[3];与``void initPointssf::Vector2f*点相同`也不例外。void initPointssf::Vector2f[3]个点;在语法上是无效的。和void initPointssf::Vector2f points[3];与``void initPointssf::Vector2f*点相同`