函数参数传递整形数组时,必须要以数组长度作参数。

来源:互联网 发布:万网备案域名 编辑:程序博客网 时间:2024/05/16 17:26

/以下是我写的c++程序。

/函数f()的功能是去掉一个最大值和最小值后求平均值。

//跳水打分

#include<iostream>

using namespace std;

void f(double a[]);    //参数是数组类型

//

int main()

{

   double a[]={7.9,8.6,9.0,7.3,6.9,8.6,8.7,7.8,9.0};

   f(a);           //注意参数的传递

   return 0;

}

//

void f(double a[])

{

   int m=sizeof(a)/sizeof(double);         //数组长度,error!!!仅仅将数组首地址传递给f(),无法求出长度(不知道何时结束)。

   double sum=0.0;

   //

   for(int i=0; i<m-1; i++)           //冒泡排序

     for(int j=0; j<m-i-1; j++)

             if(a[j]<a[j+1])

                   {   double temp=a[j];

                       a[j]=a[j+1];

                       a[j+1]=temp;

                   } //交换

   //

          for(int i=1; i<m-1; i++)

             sum+=a[i];

   //

   cout<<sum/(m-2.0);

}

tips:传递整个数组作为参数时,为什么还需要数组的长度作为参数??

传递数组作为参数时只传递了数组在内存中的首地址,但对于数组有多大,必须由数组长度来确定。否则的话函数中对于数组的操作可能会越界,即对原本不属于数组的内存进行了修改,这样可能会导致程序出错。
当然,假如你能用其他方法来判断数组的结束地址,比如数组的最后一个元素设为一个特殊值,那么你也可以不用传递数组长度。(c++中string类型也是如此)

修改如下

#include<iostream>

using namespace std;

void f(double a[]int );    //参数是数组类型,int 数组长度

//

int main()

{

   double a[]={7.9,8.6,9.0,7.3,6.9,8.6,8.7,7.8,9.0};

   int m= m=sizeof(a)/sizeof(double);     //先求出数组长度m,传递给f()

   f(a, m);           //注意参数的传递

   return 0;

}

//

void f(double a[], int m)

{

   double sum=0.0;

   for(int i=0; i<m-1; i++)           //冒泡排序

     for(int j=0; j<m-i-1; j++)

             if(a[j]<a[j+1])

                   {   double temp=a[j];

                       a[j]=a[j+1];

                       a[j+1]=temp;

                   } //交换

          for(int i=1; i<m-1; i++)

             sum+=a[i];

     //

     cout<<sum/(m-2.0);

}

// 输出结果:8.27163


原创粉丝点击