当前位置: 首页 > java >正文

【和春笋一起学C++】数组名作为函数参数实例

接上篇文章《【和春笋一起学C++】函数——C++的编程模块》,当使用数组名作为函数形参时,数组名会退化为指针,实际传递的是数组首元素的地址。

数组名在大多数情况下会退化为指针,以下两种情况除外:

  1. 当使用sizeof运算符时,如sizeof(数组名),会计算整个数组的长度;
  2. 当使用&(取地址运算符)时;

 一个简单的实例,控制台终端输入一个数组后,显示数组中各个元素的值,然后乘以一个系数后再输出各个元素的值。代码如下:

#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个数乘以同一个影响因子,再输出结果。程序运行结果如下图:

程序说明:

  1. fill_array函数的功能是输入最多包含5个元素的数组的值,也可以输入3个或4个元素。
  2. show_array函数功能是显示数组元素的值。因只需在函数中显示数组元素的值,而不需要修改其值。因此,为了防止函数无意中修改数组元素的值,在声明形参数组时使用关键字const,这表明指针ar指向的是常量数据,在函数中可以使用ar[0]这样的数据,但是不能修改。这里注意,show_array函数中的形参const double ar[]并不意味着实参数组必须是常量,它只代表不能在show_array()函数中修改ar数组元素的值。
  3. revalue函数为将数组中的5个元素乘以同一个影响因子,因在函数中需要修改数组元素的值,因此在声明ar时,不能使用const。

如果形参是普通变量(int,float等),这种保护将自动实现,这是由于C++是按值传递数据,函数使用的是数据的拷贝。但是当数组名作为函数参数时,在函数中将使用数组的原始数据,这也正是fill_array()函数能够完成任务的原因。

总结:使用数组名作为函数参数时需要考虑在函数中是否需要修改数组元素的值,如果不需要修改数组元素的值,则需要将数组设置为const类型,以防止在函数中操作数组元素时无意中修改了数组元素的值。

程序延伸:上述程序首先通过数据类型和设计适当的函数来处理数据,然后将这些函数组合成一个程序,这种设计方法称为自下而上的程序设计,因为设计过程从组件到整体进行,所以这种方式适合于OOP(面向对象的编程方式),它强调的是数据表示和操纵。传统的过程性编程(C语言)倾向于自顶向下的程序设计,它首先指定模块化的设计方案,然后再研究细节。这两种方法都很有用,最终的产品都是模块化程序。

http://www.xdnf.cn/news/5458.html

相关文章:

  • STM32f103 标准库 零基础学习之按键点灯(不涉及中断)
  • vim配置代码文档格式化
  • Http2多路复用的静态表和动态表
  • CSS专题之自定义属性
  • 记录学习《手动学习深度学习》这本书的笔记(十一)
  • Docker:安装配置教程(最新版本)
  • 元组类型的特性与应用场景:深入理解元组在 TypeScript 中的使用
  • Python训练营打卡DAY22
  • LVGL(lv_label实战)
  • 《设计模式之禅》笔记
  • 使用PHP对接印度股票市场API
  • AARRR用户增长模型(海盗指标)详解
  • C/C++跳动的爱心
  • 云计算-容器云-KubeVirt 运维
  • 【Tools】Visual Studio使用经验介绍(包括基本功能、远程调试、引入第三方库等等)
  • 深入理解 Pinia:状态管理的利器
  • [思维模式-29]:《本质思考力》-9- 两种相反的构建与解构系统的思维模式:①自顶向下的规划、分解、牵引;②自底向上的堆叠、聚合。
  • 【stata代码】地方政府驱动企业参与乡村振兴的机制——乡村振兴注意力视角的分析
  • 数据可视化大屏——智慧社区内网比对平台
  • 基于SpringBoot的抽奖系统测试报告
  • 49.EFT测试与静电测试环境和干扰特征分析
  • 2025御网杯wp(web,misc,crypto)
  • #Redis黑马点评#(五)Redisson详解
  • 并发笔记-条件变量(三)
  • 第二十一周:项目开发中遇到的相关问题(二)
  • 使用Visual Studio将C#程序发布为.exe文件
  • java加强 -Collection集合
  • Java基础语法之循环结构
  • immutable.js介绍
  • 【Diffusion】在华为云ModelArts上运行MindSpore扩散模型教程