【发布时间】:2021-09-19 08:58:43
【问题描述】:
在函数签名中定义大小数组(相对于更常用的无大小数组或指针语法)是否有任何影响?我的编译器完全忽略了它,如下面的示例代码所示(虽然它在传递较小的数组时会打印一些垃圾值)。
#include <iostream>
using namespace std;
void printArray(int intArray[5]) {
for (int i = 0; i < 5; i++) {
cout << intArray[i] << " ";
}
cout << endl;
}
int main()
{
int array1[1] = {1}; // Smaller array size than in the function signature
cout << "\nInvocation 1\n";
printArray(array1);
int array2[4] = {1, 2, 3, 4}; // Smaller array size than in the function signature
cout << "\nInvocation 2\n";
printArray(array2);
int array3[8] = {1, 2, 3, 4, 5, 6, 7, 8}; // Larger array size than in the function signature
cout << "\nInvocation 3\n";
printArray(array3);
return 0;
}
【问题讨论】:
-
是的,它更像是一个演员表。在 C++ 中,与 C 不同,您可以通过引用传递数组,它将保留大小。
-
如果您使用 std::array,C++ 语法(和语义)会变得更加清晰,例如printArray 变为 printArray(const std::array
& intArray)。这意味着您可以同时使用 const 和 reference 来显示您的意图(仅从数组中读取,不要复制)。作为奖励,您可以执行 template<:size_t n> void printArray(const std::array &) 来覆盖更多大小的数组。 -
void printArray(int[5])与void printArray(int*)完全相同。如果你定义两者,你会得到:error: redefinition of 'void printArray(int*)'.
标签: c++