Cra*_*y53 4 c++ arrays parameters function
我搜索了这个问题,大多数人都说了同样的话.他们说,由于我们只在函数中传递数组地址,因此编译器无法通过查看地址来了解数组大小.我尝试使用此代码对此进行测试,两个函数都给出了相同的结果.那么,如何将数组大小指定为函数参数以实用的方式帮助我?指定尺寸的条件在哪些方面对我们有帮助?
class ArrayTest
{
public:
void say(int ar[])
{
cout<<ar[1]<<endl;
cout<<ar[7]<<endl;
}
void say(int ar[],int sizeAn)
{
cout<<ar[1]<<endl;
cout<<ar[7]<<endl;
}
};
int main()
{
ArrayTest test;
int anAr[5] = {1,2,3,4,5};
test.say(anAr);
test.say(anAr,5);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是关于你作为程序员有机会进行边界检查,而不是编译器是否可以做到这一点.
只是尝试打印出数组中的所有元素,大小:
void say(int ar[],int sizeAn)
{
for(int i=0; i< sizeAn; ++i)
cout<<ar[i]<<endl;
}
Run Code Online (Sandbox Code Playgroud)
现在没有大小:
void say(int ar[])
{
for(int i=0; i< /*HOW DO I KNOW NOW?*/; ++i)
cout<<ar[i]<<endl;
}
Run Code Online (Sandbox Code Playgroud)
请注意,您的代码正在调用未定义的行为,因为您正在访问只有 5 个元素大的数组的第 7 个元素。例如,使用大小参数,您可以检查索引是否超过其大小,而不执行该调用。
在您的示例中,您会得到相同的结果,因为您实际上并未使用该参数:
void say(int ar[],int sizeAn)
{
cout<<ar[1]<<endl;
cout<<ar[7]<<endl;
}
Run Code Online (Sandbox Code Playgroud)
sizeAn未使用,因此没有任何区别。但请考虑以下代码:
void say(int ar[],int sizeAn)
{
for (int i = 0; i < sizeAn; i++){
cout<<ar[i]<<endl;
}
}
Run Code Online (Sandbox Code Playgroud)
在这里,它打印数组中的所有项目,因此它需要知道数组有多大。例如,如果您使用了std::vector,则不需要传递大小,因为您可以直接调用该size函数,但您不能使用 C 样式数组来执行此操作,因此如果需要,您需要将该大小作为参数传递编写一个根据大小而表现不同的函数)。
或者这是一个更实际的代码示例,其中使用 size 参数来避免未定义的行为:
void say(int ar[],int sizeAn)
{
cout<<ar[1]<<endl;
if (sizeAn >= 8){
cout<<ar[7]<<endl;
}
}
Run Code Online (Sandbox Code Playgroud)
现在它与您的代码相同,但更改为仅打印元素 7(如果确实存在)。