#include <iostream>
using namespace std;
void printarray (int arg[], int length) {
for (int n = 0; n < length; n++) {
cout << arg[n] << " ";
cout << "\n";
}
}
int main ()
{
int firstarray[] = {5, 10, 15};
int secondarray[] = {2, 4, 6, 8, 10};
printarray(firstarray, 3);
printarray(secondarray, 5);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这段代码有效,但我想了解数组是如何传递的.
当printarray从main函数调用函数时,正在传递数组的名称.数组的名称是指数组的第一个元素的地址.这等同于int arg[]什么?
Set*_*gie 33
语法
int[]
Run Code Online (Sandbox Code Playgroud)
和
int[X] // Where X is a compile-time positive integer
Run Code Online (Sandbox Code Playgroud)
完全一样
int*
Run Code Online (Sandbox Code Playgroud)
在函数参数列表中时(我省略了可选名称).
此外,阵列名称衰减到指针时传递给功能(而不是通过引用传递)的第一个元素,从而既int firstarray[3]与int secondarray[5]衰变到int*秒.
x[y]当使用相同的索引时,也会发生数组解除引用和带有下标语法的指针解除引用(下标语法)对同一元素产生左值.
这三条规则相结合,使代码合法,并按照您的预期工作; 它只是传递指向函数的指针,以及在数组衰减到指针之后你无法知道的数组的长度.
firstarray并且secondarray在传递给时转换为指向int的指针printarray().
printarray(int arg[], ...) 相当于 printarray(int *arg, ...)
但是,这不是C++特有的.C具有将数组名称传递给函数的相同规则.
这个问题已经被回答了,但是我想我应该添加一个更精确的术语和对C ++标准的引用。
这里发生了两件事,将数组参数调整为指针参数,并将数组参数转换为指针参数。这是两种完全不同的机制,第一种是对参数实际类型的调整,而另一种是标准转换,它将临时指针引入第一个元素。
对函数声明的调整:
确定每个参数的类型之后,将类型为“ T的数组”(...)的任何参数调整为“指向T的指针”。
因此int arg[]调整为int* arg。
您的函数参数的转换:
可以将“ NT数组”类型或“ T的未知边界数组”类型的左值或右值转换为“指向T的指针”类型的prvalue。应用临时物化转换。结果是一个指向数组第一个元素的指针。
因此,在中printarray(firstarray, 3);,将firstarray类型为“ 3 int的数组” 的左值转换为指向第一个元素的“ pointer to int”类型的prvalue(临时)。