如何最合适地将动态大小的数组传递给另一个函数?
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++中,数组无法以按值方式传递,因此如果要模仿这种行为,必须将const int*
或const int[]
作为参数传递。这样,即使数组以引用方式传递,由于具有const
属性,它也不会在函数内部被修改。
回答您的问题,首选方法应该是使用std::vector
,但如果您一定要使用数组,则应使用int*
。
没错。前两者等价且都是通过值传递指针。从风格上来说,第二种更受欢迎,因为它准确描述了情况——你正在向函数传递一个指针。而第一种方式则是那些不能完全相信在C++中不能传递数组的人士的一种遗留问题。在C++中没有办法按值传递数组。第三种方式是通过引用传递指针。
这里有一个混淆点,就是在所有情况下指针都“指向”你的数组。因此,在谈论按值传递还是按引用传递时,你应该清楚你是在谈论指针还是它所指向的数组。
static void test(bool arr[])
static void test(bool *arr, size_t size)
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++中的数组都是通过引用传递的,因为只传递了它们的指针地址。在数组的情况下,没有原始的按值传递的方法。
std::vector<>
而不是普通数组吗? - Basile Starynkevitch