通过文字将数组提供给c ++中的函数
Posted
技术标签:
【中文标题】通过文字将数组提供给c ++中的函数【英文标题】:Providing an array by a literal into function in c++ 【发布时间】:2021-08-07 13:51:49 【问题描述】:我是 C++ 的初学者。我遇到了一个问题。当我将数组提供给这样的函数时:
void foo(const int a[2])
// some code...
int main()
foo( 23, 63 );
return 0;
我收到错误:
E0146 初始化器太多
C2664 “void foo(const int [])”:无法将参数 1 从 “初始化列表”到“const int []”
但是当我将该数组写入变量并将变量提供给函数时,它可以正常工作
const int a[2] = 23, 63 ;
foo(a); // no problem
【问题讨论】:
可以参考void foo(const int (&a)[2]);
C++ 不支持(直接)按值传递数组。 void foo(const int a[2])
被隐式解释为 void foo(const int* a)
。您始终可以定义自己的 POD 结构,或者如果您想传递数组副本,则只需使用 std::array
。
***.com/a/66493800/7172363
【参考方案1】:
当您使用 23, 63 作为参数时,它不是一个数组。但是 C++ 编译器将能够用它初始化 std::initializer_list。看例子
#include <iostream>
#include <initializer_list>
void foo(const std::initializer_list<int>& a)
// some code...
//array overload
void foo(int(&a)[2])
//template version examples
template<typename T>
void foo(const std::initializer_list<T>& a)
template<typename T, size_t _Size>
void foo(T(&a)[_Size])
int main()
//here a temporary std::initializer_list instance will be created.
foo( 23, 63 );
int a[] = 23, 63 ;
foo(a);
return 0;
【讨论】:
【参考方案2】:在 C++ 中,函数参数绝不是数组。当您编写具有数组类型的参数时,该参数被调整为指向此类数组元素的指针。
所以,你的函数的参数是一个指针。与数组不同,不能使用包含多个值的大括号初始化列表来初始化指针。这就是为什么您的第一个示例不起作用的原因。
相比之下,可以使用数组初始化(适当类型的)指针,因为数组隐式转换为指向数组第一个元素的指针。这种转变被称为“衰变”。这就是您的第二个示例有效的原因。
参数调整和数组衰减这两个规则相辅相成,使您看起来像将数组作为参数传递,而不将参数类型限制为单个数组长度并且不复制参数(对于长数组可能会很昂贵),这是在非数组对象参数的情况下所期望的。
【讨论】:
以上是关于通过文字将数组提供给c ++中的函数的主要内容,如果未能解决你的问题,请参考以下文章
通过 c 中的管道而不是文件将数据数组传递给 gnuplot
C++ 中的高效循环缓冲区,将传递给 C 风格的数组函数参数