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


74
#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;
}

这段代码有效,但是我想了解如何传递数组。

printarray从主函数调用该函数时,将传递数组的名称。数组的名称是指数组第一个元素的地址。这等于int arg[]什么?


确切地说,数组的名称是指数组。它可以转换为指向第一个元素的指针,这在大多数情况下会发生。
约瑟夫·曼斯菲尔德

我建议让natten的答案被接受。
wally

Answers:


51

语法

int[]

int[X] // Where X is a compile-time positive integer

与...完全相同

int*

在功能参数列表中时(我省略了可选名称)。

另外,当传递到功能(而不是通过引用传递)的阵列名称衰变的指针的第一个元素,从而既int firstarray[3]int secondarray[5]衰变到int*秒。

x[y]当使用相同的索引时,使用下标语法(下标语法为)的数组取消引用和指针取消引用都会产生对同一元素的左值。

这三个规则共同使代码合法并按预期工作。它只是将指针传递给函数,以及将数组衰减为指针后无法得知的数组长度。


1
好。但是如何从函数内部访问数组。如果您说printArray(int* arg)。您如何在函数体内访问arg?
Ssenyonjo

21

当您访问数组的位置时,我只想添加此内容

arg[n]

是相同的

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

所以arg[0]*arg


15

这个问题已经被回答了,但是我想我应该添加一个更精确的术语和对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(临时)。


如何将指针中的值分配给数组,例如分配给printArray(int* arr)已定义的另一个数组,例如int myArray[5]printArray函数内部。我该怎么办myArray = arr
Ssenyonjo

9

firstarraysecondarray在传递给时转换为指向int的指针printarray()

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

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


-1

简单的答案是,数组总是通过引用传递,而int arg []只是让编译器知道期望数组

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.