9

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

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

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

例如

这些会通过价值吗?

static void test(bool arr[])

static void test(bool *arr)

这个会通过引用传递吗?

static void test(bool *&arr)

谢谢

4

5 回答 5

12

实际上,第一个想法通过地址传递数组,第三个想法通过引用传递数组。您可以设计一个小测试来检查这一点:

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++ 中,数组不能按值传递,所以如果你想模仿这种行为,你必须传递 aconst int*或 aconst int[]作为参数。这样,即使数组是通过引用传递的,它也不会因为const属性而在函数内部被修改。

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

于 2012-10-22T06:59:45.490 回答
4

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

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

于 2012-10-22T06:53:13.397 回答
2
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++ 编写 - 使用向量,而不是原始动态数组。

于 2012-10-22T06:54:33.213 回答
1

用这个:

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

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

于 2012-10-22T06:55:55.427 回答
0

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

于 2012-10-22T07:31:37.757 回答