我对被接受的答案和下面的评论感到困惑 在Passing Arrays to Function in C++中。
作为函数的形式参数,将数组作为int arr[]
或int arr[N]
传递有什么区别吗?换句话说,void foo(int arr[])
和void foo(int arr[N])
之间有区别吗?
答案 0 :(得分:7)
void foo(int arr[])
和void foo(int arr[N])
完全相同。这是因为将数组作为函数的参数调整为指针。因此,以上两种都翻译为:
void foo(int *arr)
这在C standard的6.7.6.3p7节中有关“函数声明符”的规定:
将参数声明为“类型数组”应调整为 “类型的合格指针” ,其中类型限定符(如果 任意)是在数组类型的
[
和]
中指定的 推导。如果关键字static
也出现在[
中 和]
的数组类型推导,然后每次调用 函数,相应实际参数的值 至少应提供对数组第一个元素的访问 大小表达式指定的许多元素。
C++ standard第11.3.5p5节中存在类似的语言:
一个名称可以在一个名称中用于多个不同的功能 范围;这是函数重载(第16条)。所有的声明 函数应在返回类型和 参数类型列表。函数的类型使用 遵守规则。每个参数的类型(包括函数) 参数包)由其自己的decl-specifier-seq和 声明者。 确定每个参数的类型后, 将类型“ T的数组”或函数T的参数调整为 “指向T的指针”。在生成参数类型列表之后,任何 修改参数类型的最前级lcv限定词在以下情况下被删除 形成函数类型。转换后的参数的结果列表 类型以及是否存在省略号或功能 参数包是函数的参数类型列表。[注意:此 转换不会影响参数的类型。