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

Tom*_*lli 7 c c++ arrays

我对接受的答案及其下面的评论感到困惑,这些评论在将数组传递给 C++ 中的函数中说明了相反的事情。

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

dbu*_*ush 7

这两个void foo(int arr[])void foo(int arr[N])是完全等价的。这是因为作为函数参数的数组被调整为指针。所以上面两个都翻译成:

void foo(int *arr)
Run Code Online (Sandbox Code Playgroud)

这在C 标准的第 6.7.6.3p7 节关于“函数声明符”中指定:

将参数声明为“类型数组”应调整为“指向类型的限定指针”, 其中类型限定符(如果有)是在数组类型派生的[]中指定的那些。如果关键字static也出现在数组类型派生的[ and]中,那么对于函数的每次调用,相应实参的值应提供对数组的第一个元素的访问,该元素至少与大小指定的元素一样多表达。

类似的语言存在于C++ 标准的11.3.5p5 节中:

一个名称可以在一个范围内用于多个不同的功能;这是函数重载(第 16 条)。函数的所有声明在返回类型和参数类型列表中都应完全一致。使用以下规则确定函数的类型。每个参数的类型(包括函数参数包)由其自己的 decl-specifier-seq 和 declarator 确定。在确定每个参数的类型后,任何类型为“数组 T”或函数类型为 T 的参数都被调整为“指向 T 的指针”。生成参数类型列表后,在形成函数类型时删除任何修改参数类型的顶级 lcv 限定符。转换后的参数类型的结果列表以及省略号或函数参数包的存在与否就是函数的参数类型列表。[注意:此转换不影响参数的类型。

  • 更改它可能比值得更改的更麻烦,因为您必须允许数组中的大小表达式不在最外层,如“int a[][x]”,并且必须对这些表达式进行计算,以便被调用的函数知道尺寸。除了最外层的维度之外,在语法中处理可能会很麻烦。尽管已经有一些变化;参数中的“int a[static 4]”表示“a”指向至少有 4 个元素的位置(因此“a”不能是空指针)。 (2认同)