为什么在传递给C++函数时我们将数组大小指定为参数?

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)

Pet*_*erT 8

这是关于你作为程序员有机会进行边界检查,而不是编译器是否可以做到这一点.

只是尝试打印出数组中的所有元素,大小:

 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)


Bla*_*aze 3

请注意,您的代码正在调用未定义的行为,因为您正在访问只有 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(如果确实存在)。