Java 和 Python 等其他语言确实会在运行时存储数组的长度。在 C++ 数组中,不存储数组的长度。这意味着您需要手动将其存储在某个地方。
只要您的代码中有一个固定大小的数组,编译器就会知道该数组的大小,因为它是从源代码本身读取的。但是一旦代码被编译,长度信息就会丢失。例如:
void f1(double array[10]) {...}
编译器不会强制数组的大小。以下代码将静默编译,因为f1 的数组参数只是指向数组第一个元素的指针:
void h1() {
double a[10];
double b[5];
f1(a); // OK.
f2(b); // Also OK.
}
由于编译器在将数组传递给函数时会忽略数组的静态大小,因此您必须知道作为引用传递的任意大小数组的大小的唯一方法是显式声明大小:
void f2(double array[], size_t array_size) {...}
然后你可以用任何数组调用那个函数:
void h2() {
double a[10];
double b[19];
f2(a, sizeof(a) / sizeof(a[0]));
f2(b, sizeof(a) / sizeof(a[0]));
}
参数array_size包含数组的实际大小。
请注意,sizeof(array) 仅适用于静态定义的数组。当您将该数组传递给另一个函数时,大小信息会丢失。
数组与指针不同。但是,像f2 的参数这样的未定义大小的数组只是指向序列中第一个double 元素的指针:
void f3(double array*, size_t array_size) {...}
对于任何实际用途,f2 和 f3 是等效的。
这正是std::vector 的工作原理。在内部,向量是具有两个字段的类:指向第一个元素的指针和向量中的元素数。当您想要接受任何大小的数组作为参数时,这会使事情变得更简单:
void g(std::vector& v) {...}