通过文字将数组提供给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 ++中的函数[重复]

通过 c 中的管道而不是文件将数据数组传递给 gnuplot

如何将字符串数组传递给C中的函数?

C++ 中的高效循环缓冲区,将传递给 C 风格的数组函数参数

如何将 simulink 中的数组结构提供给自定义 C 代码函数?

如何通过c中的指针传递二维数组[重复]