在C++中将数组传递给函数

Jay*_*y K 60 c++

#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]当使用相同的索引时,也会发生数组解除引用和带有下标语法的指针解除引用(下标语法)对同一元素产生左值.

这三条规则相结合,使代码合法,并按照您的预期工作; 它只是传递指向函数的指针,以及在数组衰减到指针之后你无法知道的数组的长度.

  • 绝对错了.'int []'和'int [X]'是数组类型,它们保持这种状态.指针衰减的数组是将数组类型的变量隐式转换为第一个元素的指针,如果需要的话.这个函数声明会发生什么完全不同 - 函数参数的类型调整为指向它的第一个元素的指针 - 这不是指针衰减的数组.我不知道为什么没有人告诉过你. (17认同)
  • 好的。但是如何从函数内部访问数组。如果你使用`printArray(int* arg)`。如何访问函数体内的arg? (3认同)

DGo*_*mez 17

我只想添加这个,当你访问数组的位置时

arg[n]

是相同的

*(arg + n) than表示从de arg地址开始的n的偏移量.

所以arg[]*arg


Ola*_*che 9

firstarray并且secondarray在传递给时转换为指向int的指针printarray().

printarray(int arg[], ...) 相当于 printarray(int *arg, ...)

但是,这不是C++特有的.C具有将数组名称传递给函数的相同规则.


kna*_*ten 7

这个问题已经被回答了,但是我想我应该添加一个更精确的术语和对C ++标准的引用。

这里发生了两件事,将数组参数调整为指针参数,并将数组参数转换为指针参数。这是两种完全不同的机制,第一种是对参数实际类型的调整,而另一种是标准转换,它将临时指针引入第一个元素。

对函数声明的调整:

dcl.fct#5

确定每个参数的类型之后,将类型为“ T的数组”(...)的任何参数调整为“指向T的指针”。

因此int arg[]调整为int* arg

您的函数参数的转换:

转换数组#1

可以将“ NT数组”类型或“ T的未知边界数组”类型的左值或右值转换为“指向T的指针”类型的prvalue。应用临时物化转换。结果是一个指向数组第一个元素的指针。

因此,在中printarray(firstarray, 3);,将firstarray类型为“ 3 int的数组” 的左值转换为指向第一个元素的“ pointer to int”类型的prvalue(临时)。