在C / C ++中,将数组作为形式参数传递为int arr []和int arr [N]之间的区别

时间:2019-12-26 17:41:04

标签: c++ c arrays

我对被接受的答案和下面的评论感到困惑 在Passing Arrays to Function in C++中。

作为函数的形式参数,将数组作为int arr[]int arr[N]传递有什么区别吗?换句话说,void foo(int arr[])void foo(int arr[N])之间有区别吗?

1 个答案:

答案 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限定词在以下情况下被删除   形成函数类型。转换后的参数的结果列表   类型以及是否存在省略号或功能   参数包是函数的参数类型列表。[注意:此   转换不会影响参数的类型。