【问题标题】:Passing Arrays to Function in C++将数组传递给 C++ 中的函数
【发布时间】:2013-01-13 22:49:01
【问题描述】:
#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[]

【问题讨论】:

  • 具体来说,数组名是指数组。它可以转换为指向第一个元素的指针,这在大多数情况下都会发生。
  • 我建议让 knatten 的答案成为公认的答案。

标签: c++


【解决方案1】:

语法

int[]

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

完全一样

int*

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

此外,当传递给函数(而不是通过引用传递)时,数组名称衰减为指向第一个元素的指针,因此int firstarray[3]int secondarray[5] 都衰减为int*s。

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

这三个规则结合起来使代码合法并按照您的期望工作;它只是将指针传递给函数,以及在数组衰减到指针后您无法知道的数组长度。

【讨论】:

  • 好的。但是如何从函数内部访问数组。如果你使用说printArray(int* arg)。如何访问函数体内的 arg?
【解决方案2】:

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

arg[n]

一样

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

所以arg[0] 将是*arg

【讨论】:

    【解决方案3】:

    这个问题已经得到解答,但我想我会添加一个更精确的术语和对 C++ 标准的引用的答案。

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

    对函数声明的调整:

    dcl.fct#5:

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

    所以int arg[]被调整为int* arg

    函数参数的转换:

    conv.array#1

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

    所以在printarray(firstarray, 3); 中,“3 int 数组”类型的左值firstarray 被转换为“pointer to int”类型的纯右值(临时),指向第一个元素。

    【讨论】:

    • 如何从printArray(int* arr) 函数内部将指向数组的指针(例如printArray(int* arr))分配给另一个已经定义的数组,例如int myArray[5]。我该怎么做myArray = arr
    【解决方案4】:

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

    printarray(int arg[], ...) 等价于printarray(int *arg, ...)

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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 2018-11-14
        • 2012-07-25
        • 2011-11-08
        • 1970-01-01
        • 1970-01-01
        • 2013-06-26
        相关资源
        最近更新 更多