在 C/C++ 中将数组作为形式参数作为 int arr[] 和 int arr[N] 传递的区别
Difference between passing an array as formal parameter as int arr[] and int arr[N] in C/C++
我对接受的答案和它下面的评论感到困惑,这些评论陈述了相反的事情 在传递数组以在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 限定符在以下情况下将被删除 形成函数类型。转换参数的结果列表 类型以及省略号或函数的存在与否 参数包是函数的参数类型列表。[注:本 转换不会影响参数的类型。
- 为什么在全局范围内使用"extern int a"似乎不行?
- arr[-1]在c++中的奇怪行为
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- different between int **arr =new int [ n]; and int a[i][j]?
- 在 C/C++ 中将数组作为形式参数作为 int arr[] 和 int arr[N] 传递的区别
- 如何理解"vector<int> avector (arr, arr + sizeof(arr) / sizeof(arr[0]) )"?
- 声明数组>> int arr[] 时出错;在C++(虽然在 Java 中有效)?
- 失败,dummy_array<int, 6> arr();
- 为什么在这种情况下使用 int *arr = new int [number]
- arr++ 在函数"int f(int arr[])"中是什么意思?
- C typedef int arr [x] [y]在stackdump错误中失败
- 在 for (int val :arr) 中,冒号是什么意思
- C++ 指针上的开始/结束 (arr) - 调用 'begin(int**&)' 没有匹配函数
- 可以在C++中声明这样的数组吗:`int arr[3/0]`
- 为什么int** ptr在访问ptr[i][j]时不指向与int arr[3][3]相同的地址?
- 创建大小为 int arr[1000000][1000000] 的大型 2D 数组