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

  • 本文关键字:int arr 区别 C++ 数组 参数 c++ c arrays
  • 更新时间 :
  • 英文 :


我对接受的答案和它下面的评论感到困惑,这些评论陈述了相反的事情 在传递数组以在C++中运行。

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

void foo(int arr[])void foo(int arr[N])完全等价。 这是因为作为函数参数的数组被调整为指针。 因此,以上两个都转化为:

void foo(int *arr)

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

将参数声明为"类型数组"应调整为 "限定指向类型的指针",其中类型限定符(如果 any( 是在数组类型的[]中指定的那些 派生。 如果关键字static也出现在[]数组类型派生,然后对于每次调用 函数,对应实际参数的值 应提供对数组第一个元素的访问,至少为 大小表达式指定的许多元素。

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

单个名称可用于单个中的多个不同功能 范围;这就是函数重载(条款 16(。的所有声明 函数应在返回类型和 参数类型列表。函数的类型由 遵循规则。每个参数的类型(包括函数( 参数包(由其自己的 decl-specifier-seq 和 说明符。确定每个参数的类型后,任何 类型为"T 数组"或函数类型 T 的参数调整为 "指向 T 的指针"。生成参数类型列表后,任何 修改参数类型的顶级 LCV 限定符在以下情况下将被删除 形成函数类型。转换参数的结果列表 类型以及省略号或函数的存在与否 参数包是函数的参数类型列表。[注:本 转换不会影响参数的类型。

最新更新