我听不懂,所以请帮助我。 当我们将数组传递给任何函数,然后在函数参数中写入数组类型以获取它,但是为什么我们不在参数中初始化其大小。
答案 0 :(得分:1)
在C ++中,始终尽可能选择容器而不是原始指针或数组。
函数签名中的数组类型实际上是指针。以下三个声明完全相同:
void foo(int a[10]);
void foo(int a[]);
void foo(int* a);
在所有三种情况下,foo
都使用一个参数:指向int
的指针。当您将数组传递给该函数时,它隐式衰减为指向其第一个元素的指针。
当数组衰减为指针时,数组的长度会丢失。这意味着以下代码将被编译,但是在逻辑上是错误的:
void foo(int a[10]) {
for (size_t i = 0; i < 10; ++i) {
std::cout << a[i] << '\n';
}
}
int main() {
// Whoops, wrong size array!
int arr[5] = {};
foo(arr);
}
在这种情况下,长度声明是一个完整的谎言。在函数定义中写入无意义的数字只会增加有人出错的风险。
如果必须将原始指针用于接受数组的函数参数,则函数还应接受size参数:
void foo(int* a, size_t length) {
for (size_t i = 0; i < length; ++i) {
std::cout << a[i] << '\n';
}
}
int main() {
int arr[5] = {};
foo(arr, 5);
}
这也是很危险的,因为某人完全有可能传递错误的 大小并引起错误:
void foo(int* a, size_t length) {
for (size_t i = 0; i < length; ++i) {
std::cout << a[i] << '\n';
}
}
int main() {
int arr[5] = {};
//Whoops, passed the wrong size!
foo(arr, 10);
}
因此,您应该首选使用容器:
void foo(const std::vector<int>& a) {
for (int i : a) {
std::cout << i << '\n';
}
}
int main() {
std::vector<int> arr(5);
foo(arr);
}
如果您不知道要使用哪种容器;默认为std::vector
。如果您的函数必须支持多种类型的容器,请使用模板:
template <typename Container>
void foo(const Container& a) {
for (int i : a) {
std::cout << i << '\n';
}
}
int main() {
std::vector<int> arr(5);
foo(arr);
std::array<int, 5> arr2 = {};
foo(arr2);
}
答案 1 :(得分:0)
您当然可以指定(固定)数组大小作为函数参数-您必须通过引用传递数组。
void func(int (&x)[100]);
正在传递大小为100的int数组。
您甚至可以为其创建模板
template<class T, size_t N> void func(T (&x)[N]) {...}