本文的学习内容参考:http://blog.****.net/wwdlk/article/details/6322843
1.当用数组名作为函数参数时,函数的实参和形参都应为数组名(或者指针);
Example1:有一个一维数组score,内放10个学生成绩,求平均成绩。
#include<iostream>
using namespace std; float average(float array[],int num) {
int i;
float aver, sum = array[];
for (i = ; i< num; i++)
sum = sum + array[i];
aver = sum / num;
return aver;
}
int main()
{
float aver;
int number;
cout << "please input number:";
cin >> number;
float *score = new float[number]; //动态创建一维数组score
if (score == NULL) //检查内存空间是否分配完成
{
cout << "could not allocate.Bye..." << endl;
exit();
}
cout << "please input secores:" << endl;
for (int i = ; i < number; i++)
cin >> score[i];
cout << endl;
aver = average(score,number);//数组名作为函数参数
cout << "the average score is " << aver << endl;
system("pause");
return ;
}
说明:
(1)用数组名称作函数参数,应该在主调函数和被调函数分别定义数组,本例中array是形参数组名,score是实参数组名,分别在其所在的函数中定义,不能只在一方定义;
(2)实参数组与形参数组类型应该保持一致(这里都为float型);
(3)形参数组可以不指定大小,此时可以在定义数组时,在数组名后面跟一个空的方括号;当需要在被调用函数中处理数组元素时,可以另设一个参数,传递需要处理的数组元素的个数;
如下所示,根据不同的数组长度来处理不同的数据Demo
#include<iostream>
using namespace std;
float average(float array[], int n) {
int i;
float aver, sum = array[];
for (i = ; i<n; i++)sum = sum + array[i];
aver = sum / n;
return aver;
} void main() {
float score_1[] = { 98.5,,91.5,, };
float score_2[] = { 67.5,89.5,,69.5,,89.5,76.5,,,99.5 };
cout << "the average of class A is :" << average(score_1, ) << endl;
cout << "the average of class B is :" << average(score_2, ) << endl;
system("pause");
return;
}
(4)用数组名作为函数实参的时,不是把数组元素的值传递给形参,而是把实参数组的起始地址传递给形参数组,这样两个数组就共占同一段内存单元。
2.用数组作为函数参数的集中情况(学习内容参考http://blog.****.net/zeusuperman1/article/details/8509287)
#include<iostream>
#include<vector>
using namespace std; char s[] = "";
int a[] = { , };
int b[] = { , };
void Display(char *c);
void PutArray1(int *p, int length);
void PutArray2(int p[], int length);
void PutArray3(int p[]);
void PutArray4(int(&p)[]);
void PutArray5(vector<int> vec); //向量作为函数参数 void main()
{
char q;
vector<int> vector(,);
cout << "这个是在主函数中对数组长度的测试:" << sizeof(s) << endl;
Display(s);
cout << "-------------------------------" << endl;
PutArray1(a, );
PutArray2(a, );
PutArray3(a);
PutArray4(b);
PutArray5(vector);
system("pause");
return;
}
void Display(char *c)
{
cout << "这个是在子函数中对数组长度的测试:" << sizeof(c) << endl;
}
void PutArray1(int *p, int len)
{
int length1 = sizeof(p);
cout << "第一种方法的输出:" << endl;
cout << "第一种方法数组的长度为:" << length1 << endl;
for (int i = ;i < length1;i++)
{
cout << p[i] << " ";
}
cout << endl;
}
void PutArray2(int p[], int len)
{
int length = sizeof(p);
cout << "第二种方法的输出:" << endl;
cout << "第二种方法数组的长度为:" << length << endl;
for (int i = ;i < length;i++)
{
cout << p[i] << " ";
}
cout << endl;
}
void PutArray3(int p[])
{
int length = sizeof(p);
cout << "第三种方法的输出:" << endl;
cout << "第三种方法数组的长度为:" << length << endl;
for (int i = ;i < length;i++)
{
cout << p[i] << " ";
}
cout << endl;
}
void PutArray4(int(&p)[])
{
int length = sizeof(p);
cout << "第四种方法的输出:" << endl;
cout << "第四种方法数组的长度为:" << length << endl;
for (int i = ;i < length;i++)
{
cout << p[i] << " ";
}
cout << endl;
} void PutArray5(vector<int> vec)
{
vector<int>::iterator begin_iter = vec.begin();
vector<int>::iterator end_iter = vec.end();
int size = vec.size();
cout << "第五种方法的输出:" << endl;
cout << "第五种方法数组的长度为:" << size << endl;
cout << "下面这种方法是采用向量遍历的方法遍历数组:" << endl;
for (vector<int>::iterator iter = begin_iter;iter != end_iter;iter++)
{
cout << *iter << " ";
}
cout << endl;
cout << "下面这种方法是采用普通遍历数组的方法遍历数组:" << endl;
for (int i = ;i < size;i++)
{
cout << vec[i] << " ";
}
cout << endl;
}
result:
总结:
(1)在这里,int *arr和int arr[]的含义相同,编译器自动将 int arr[]替换为int *arr,所以这也解释了上面在主函数和子函数中利用数组名求数组长度会得到不同结果的原因。这种情况只有在数组作为函数参数进行传递时才会发生;
(2)在子函数中无法直接获得作为参数的数组的长度,因此数组的长度必须在函数中作为参数进行传递;