【问题标题】:Proper way to pass dynamic arrays to other functions将动态数组传递给其他函数的正确方法
【发布时间】:2012-10-11 22:58:03
【问题描述】:

将动态大小的数组传递给另一个函数的最“正确”方式是什么?

bool *used = new bool[length]();

我想出了几种编译方法,但我不太确定正确的方法是什么。

例如

这些会按价值传递吗?

static void test(bool arr[])

static void test(bool *arr)

这个会通过引用吗?

static void test(bool *&arr)

谢谢

【问题讨论】:

  • 你想在你的函数中做什么?您想要它是按值传递还是按引用传递?
  • 您是否考虑过使用std::vector<> 而不是普通数组?
  • 啊,好点子。我通常会在 C++ 中使用向量,但我认为我应该将其标记为 C 问题!看看我能不能解决它。
  • @noko,不,它是 C++,C 中没有引用。
  • 抱歉,已修复错别字。意思是说 C++ 而不是 C。

标签: c++ arrays dynamic


【解决方案1】:

其实第一个思路是通过地址传递数组,第三个思路是通过引用传递数组。您可以设计一个小测试来检查这一点:

void test1(int* a) {
    a[0] = 1;
}

void test2(int a[]) {
    a[1] = 2;
}

void test3(int *&a) {
    a[2] = 3;
}

int main() {
    int *a = new int[3]();
    a[0] = 0;
    a[1] = 0;
    a[2] = 0;

    test1(a);
    test2(a);
    test3(a);

    cout << a[0] << endl;
    cout << a[1] << endl;
    cout << a[2] << endl;
}

这个测试的输出是

1
2
3

如果参数按值传递,则不能在函数内部对其进行修改,因为修改将保留在函数的范围内。在 C++ 中,数组不能按值传递,所以如果你想模仿这种行为,你必须传递 const int*const int[] 作为参数。这样,即使数组是通过引用传递的,由于const属性,它也不会在函数内部被修改。

要回答您的问题,首选方法是使用std::vector,但如果您绝对想使用数组,则应该使用int*

【讨论】:

  • 那是在非技术意义上使用引用。只有第三个示例涉及实际引用。
  • 我指的是“按引用传递”而不是“按值传递”。我认为这就是问题所在。
  • 当然,但是前两个示例按值传递一个指针,该指针恰好引用了一个数组。所以我个人会说前两个是传值的例子。但这只是术语,只要 OP 理解一切都可以。
  • 这就是为什么我用 bold letters 写了 array 是通过引用传递的:)
  • 你没有delete数组... >:(
【解决方案2】:

你是对的。前两个是等价的,通过值传递一个指针。从风格上讲,第二个是首选,因为它准确地描述了情况,即您正在传递一个指向您的函数的指针。对于那些不太相信你不能在 C++ 中传递数组的人来说,第一个是一种宿醉。在 C++ 中无法按值传递数组。第三个通过引用传递一个指针。

这里有一个混淆,在所有情况下,指针都“引用”你的数组。因此,在谈论按值传递或按引用传递时,您应该清楚您是在谈论指针还是它所引用的数组。

【讨论】:

    【解决方案3】:
    static void test(bool arr[])
    static void test(bool *arr, size_t size)
    

    对于静态/动态数组,如果您不想更改此指针的位置。

    示例: http://liveworkspace.org/code/c5e379ebe2a051c15261db05de0fc0a9

    static void test(bool *&arr)
    

    如果您想更改位置,则为动态。

    示例:http://liveworkspace.org/code/bd03b214cdbe7c86c4c387da78770bcd

    但是,由于您使用 C++ 编写 - 使用向量,而不是原始动态数组。

    【讨论】:

      【解决方案4】:

      使用这个:

      void myFuncThatAcceptsDynamicArrays(bool* array, int size) {
         // Do something (using the size as the size of the array)
      }
      

      由函数的用户提供有效的大小(这可能非常危险)。

      【讨论】:

        【解决方案5】:

        我总是将向量用于动态大小的数组。在所有情况下,C++ 中的数组都是通过引用传递的,因为它们的指针地址只被传递。在数组的情况下,没有原始的值传递方式。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-09-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-02-11
          • 2022-01-11
          相关资源
          最近更新 更多