【和春笋一起学C++】数组名作为函数参数实例
接上篇文章《【和春笋一起学C++】函数——C++的编程模块》,当使用数组名作为函数形参时,数组名会退化为指针,实际传递的是数组首元素的地址。
数组名在大多数情况下会退化为指针,以下两种情况除外:
- 当使用sizeof运算符时,如sizeof(数组名),会计算整个数组的长度;
- 当使用&(取地址运算符)时;
一个简单的实例,控制台终端输入一个数组后,显示数组中各个元素的值,然后乘以一个系数后再输出各个元素的值。代码如下:
#include <iostream>
using namespace std;int fill_array(double ar[], int maxlength)
{double temp;int i;for (i = 0; i < maxlength; i++){cout << "Enter value: " << (i + 1) << ": ";cin >> temp;if (!cin){cin.clear();while (cin.get()!='\n'){continue;}cout << "bad input, input process terminated. \n";break;}ar[i] = temp;}return i;
}void show_array(const double ar[], int n)
{for (int i = 0; i < n; i++){cout << ar[i] << " ";}cout << "\n\n" << endl;
}void revalue(double r, double ar[], int n)
{for (int i = 0; i < n; i++){ar[i] *= r;}
}int main()
{ const int maxLength = 5;double properties[maxLength];cout << "please input show number: " << endl;fill_array(properties, maxLength);show_array(properties, maxLength);double factor;cout << "please input revalue factor: " << endl;cin >> factor;revalue(factor, properties, maxLength);show_array(properties, maxLength);return 0;
}
输入5个数,程序先显示5个输入的数,然后再输入一个影响因子,将5个数乘以同一个影响因子,再输出结果。程序运行结果如下图:
程序说明:
- fill_array函数的功能是输入最多包含5个元素的数组的值,也可以输入3个或4个元素。
- show_array函数功能是显示数组元素的值。因只需在函数中显示数组元素的值,而不需要修改其值。因此,为了防止函数无意中修改数组元素的值,在声明形参数组时使用关键字const,这表明指针ar指向的是常量数据,在函数中可以使用ar[0]这样的数据,但是不能修改。这里注意,show_array函数中的形参const double ar[]并不意味着实参数组必须是常量,它只代表不能在show_array()函数中修改ar数组元素的值。
- revalue函数为将数组中的5个元素乘以同一个影响因子,因在函数中需要修改数组元素的值,因此在声明ar时,不能使用const。
如果形参是普通变量(int,float等),这种保护将自动实现,这是由于C++是按值传递数据,函数使用的是数据的拷贝。但是当数组名作为函数参数时,在函数中将使用数组的原始数据,这也正是fill_array()函数能够完成任务的原因。
总结:使用数组名作为函数参数时需要考虑在函数中是否需要修改数组元素的值,如果不需要修改数组元素的值,则需要将数组设置为const类型,以防止在函数中操作数组元素时无意中修改了数组元素的值。
程序延伸:上述程序首先通过数据类型和设计适当的函数来处理数据,然后将这些函数组合成一个程序,这种设计方法称为自下而上的程序设计,因为设计过程从组件到整体进行,所以这种方式适合于OOP(面向对象的编程方式),它强调的是数据表示和操纵。传统的过程性编程(C语言)倾向于自顶向下的程序设计,它首先指定模块化的设计方案,然后再研究细节。这两种方法都很有用,最终的产品都是模块化程序。