我不明白为什么以下示例编译并运行:
void printValues(int nums[3], int length) {
for(int i = 0; i < length; i++)
std::cout << nums[i] << " ";
std::cout << '\n';
}
似乎完全忽略了3的大小,但是放入无效的大小会导致编译错误。这是怎么回事?
答案 0 :(得分:10)
在C ++(以及C语言)中,使用数组类型声明的参数总是立即衰减为指针类型。以下三个声明是等效的
void printValues(int nums[3], int length);
void printValues(int nums[], int length);
void printValues(int *nums, int length);
即。大小无关紧要。然而,它仍然不意味着你可以在那里使用无效的数组声明,例如,指定负数或零大小是非法的。
(顺便说一下,同样适用于函数类型的参数 - 它会立即衰减到指针到函数类型。)
如果要强制参数和参数之间的数组大小匹配,请在参数声明中使用指针或引用数组类型
void printValues(int (&nums)[3]);
void printValues(int (*nums)[3]);
当然,在这种情况下,大小将成为编译时常量,并且无法再传递length
。
答案 1 :(得分:2)
我没有看到你所指的编译错误 - 传递给函数 decay 的数组到指针而你丢失了数组类型信息。您可能也曾使用过:
void printValues(int* nums, int length);
您可以使用引用来避免指针衰减:
void printValues(int (&nums)[3], int length);
如果你不想要固定大小的数组,或者只是使用指针。
答案 2 :(得分:-2)
不会忽略数组的大小,它是参数类型的一部分。如果您尝试将任何其他大小的数组传递给函数,则应该收到编译器错误。
另一方面,C和C ++不对数组访问进行边界检查,因此从这个意义上来说, 被忽略了。但在任何其他环境中也是如此,不仅仅是函数参数。