传递动态数组给其他函数的正确方法

9

如何最合适地将动态大小的数组传递给另一个函数?

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

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

例如:

这些是否传递值?

static void test(bool arr[])

static void test(bool *arr)

这个会通过引用传递吗?
static void test(bool *&arr)

谢谢


在你的函数中,你想要做什么?你是希望它按值传递还是按引用传递? - alestanis
2
你考虑过使用 std::vector<> 而不是普通数组吗? - Basile Starynkevitch
啊,说得好。我通常会在C++中使用向量,但我认为我应该将其标记为C问题!看看我能否解决它。 - noko
@noko,不是的,这是C++,C语言中没有引用。 - john
抱歉,打错字了。本意是说 C++ 而不是 C。 - noko
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++中,数组无法以按值方式传递,因此如果要模仿这种行为,必须将const int*const int[]作为参数传递。这样,即使数组以引用方式传递,由于具有const属性,它也不会在函数内部被修改。

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


1
这是在非技术意义上使用引用。只有第三个例子涉及实际引用。 - john
1
当然可以,但是前两个示例通过值传递指针,它恰好引用一个数组。因此我个人认为前两个示例是按值传递的示例。但这仅仅是术语上的区分问题,只要提问者理解了,就没有问题。 - john
1
这就是为什么我用粗体字写明了该数组是通过引用传递的原因 :) - alestanis
1
抱歉,没有“指针传递”。前两个示例是通过值传递指针。第三个是通过引用传递指针。它们都没有传递数组,只有指针。 - Joseph Mansfield
3
你没有“删除”这个数组... >:( - Elias Kosunen
显示剩余10条评论

4

没错。前两者等价且都是通过值传递指针。从风格上来说,第二种更受欢迎,因为它准确描述了情况——你正在向函数传递一个指针。而第一种方式则是那些不能完全相信在C++中不能传递数组的人士的一种遗留问题。在C++中没有办法按值传递数组。第三种方式是通过引用传递指针。

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


2

1

请使用此功能:

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

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


0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接