将动态大小的数组传递给另一个函数的最“正确”方法是什么?
bool *used = new bool[length]();
我想出了几种编译方法,但我不太确定正确的方法是什么。
例如
这些会通过价值吗?
static void test(bool arr[])
static void test(bool *arr)
这个会通过引用传递吗?
static void test(bool *&arr)
谢谢
实际上,第一个想法通过地址传递数组,第三个想法通过引用传递数组。您可以设计一个小测试来检查这一点:
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*
.
你是对的。前两个是等价的,通过值传递一个指针。从风格上讲,第二个是首选,因为它准确地描述了情况,即您正在传递一个指向您的函数的指针。对于那些不太相信你不能在 C++ 中传递数组的人来说,第一个是一种宿醉。在 C++ 中无法按值传递数组。第三个通过引用传递一个指针。
这里有一个混淆,在所有情况下,指针都“引用”你的数组。因此,在谈论按值传递或按引用传递时,您应该清楚您是在谈论指针还是它所引用的数组。
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++ 编写 - 使用向量,而不是原始动态数组。
用这个:
void myFuncThatAcceptsDynamicArrays(bool* array, int size) {
// Do something (using the size as the size of the array)
}
由函数的用户提供有效的大小(这可能非常危险)。
我总是将向量用于动态大小的数组。在所有情况下,C++ 中的数组都是通过引用传递的,因为它们的指针地址只被传递。在数组的情况下,没有原始的方法可以按值传递。