博客
关于我
C++中的数组函数
阅读量:323 次
发布时间:2019-03-03

本文共 2539 字,大约阅读时间需要 8 分钟。

  C++中函数拥有参数与参量,也就是实参与形参。

  在研究数组函数之前先看一下基本型变量在函数中的表现:

int	argument = 100;//定义一个实际变量int function1(int parameter);//声明函数int main(){	int a = function1(argument);	……}

  显然声明函数中的变量parameter是形参,C++中通常称之为参量;调用函数时的变量argument是实参,C++通常称之为参数。在函数调用的过程中值在参数与参量之间存在一个名叫值传递的过程:当function1()函数被调用时,编译器会生成一个新变量parameter,随后先前被赋值的argument将自己的值赋给parameter,然后parameter进入function1()函数中进行工作。值传递过程说明了C++程序调用时变量运作的机制:实参(参数)实际上是不进入被调用的函数工作的,它将自己的值拷贝一份给形参(参量),然后形参(参量)进函数开始工作,形参(参量)在函数里怎么折腾,实参(参数)的值也不会有变化。

  如果参数与参量都是数组的话,那么函数调用时的值传递还会和基本型变量一样么?带着这个问题来看一下数组函数的使用。以下代码为一个基础的数组累加函数调用:

#include 
const int size=9;//定义数组长度int sum_arr(int arr[],int n);//声明数组累加函数int main(){ using namespace std; int OneArray[size]={1,2,3,4,5,6,7,8,9}; int sum=sum_arr(OneArray,size);//调用函数 cout<<"Sum:"<
<

  函数运行结果无需赘述,这里仔细观察数组函数的写法:

int sum_arr(int arr[],int n){	for(int i=0;i

  该函数传入了两个参数,一个是arr[],一个是n。n好理解,n就是参数数组本身的长度。arr[]传递的是什么呢?虽然在函数内部arr直接当做数组进行使用,但是这里需要明白arr并不是一个数组,而是一个指针。

  C++将数组名称视为指针,并且将其解释为数组中第一个元素的地址,即:

OneArray == &OneArray[0];

  OneArray是数组名,OneArray也就是第一个元素的地址,因此可以得出数组函数传递的是一个地址。OneArray内元素的类型都为int,那么OneArray的类型也一定是个int指针,也就是int *。综上,原先的数组函数函数头可以改写为:

int sum_arr(int *arr,int n)

  这里需要注意,C++中只有在函数头与函数原型中,int *arr与int arr[]的含义才相同。在其余场合下这两种表达显然是不能等价的。在函数中可以直接使用arr[i],同时也可以用指针表示法表示数组:

arr[i] == *(arr + i);//某元素的值&arr[i] == arr +i;//某元素的地址

  知道数组函数怎么写了,继续研究一下数组函数的值传递是如何实现的。显然,参数数组与参量数组的元素值与排列应该是没有区别的,为了观察值传递的本质,在程序中稍微修改一下,观察参数数组与参量数组的首地址与长度。代码如下:

#include 
const int size=9;//数组长度int sum_arr(int arr[],int n);//数组累加函数int main(){ using namespace std; int OneArray[size]={1,2,3,4,5,6,7,8,9}; cout<
<<"=argument array address,";//打印参数(argument)的地址 cout<

  代码跑出的结果如下:

在这里插入图片描述
  代码跑出来的结果比较吓人,这里仔细分析一下结果意味着什么:首先第一列,参数数组与参量数组的首地址一模一样,这也意味着参数数组和参量数组实际上是一个数组,这和基本类型函数的值传递可截然相反。基本类型函数的参数与参量是两个变量,因此地址一定不同;数组函数的参数数组与参量数组首地址相同,说明编译器并没有创建一个新的参量数组并将参数数组的值赋给它,而是直接把参数数组拿去给函数用了。
  第二列中,参数数组的长度是4*9=36,正常;参量数组的长度是4,这个相对好理解,因为参量数组的arr只是一个int型指针,虽然它的首地址与参数数组相同,但它本身只是个记录首地址的指针罢了,因此只有4个字节。这里也可以看出为什么数组函数还要傻傻地人为赋值数组长度,因为它确实不知道数组是多长。
  经过分析可以得出数组函数被调用时得到的是数组的类型、长度与数组的首地址。函数调用的时候也存在值传递过程,只不过是传递的是首地址,而不是数组的内容。
  数组函数的使用暴露出一个问题,就是函数直接使用原始数据,造成误操作的风险比较大。诚然我们可以用const修饰参数数组令其内容无法改变,但是写代码不能简单的一棍子敲死,数组的内容是否改变需要看具体需求的,我们尽量做到的是在不需要修改内容的部分为其增加“安保措施”。
  最为简单高效的安保措施就是修改函数头:

int sum_arr(const int arr[],int n)int sum_arr(const int *arr,int n)

  该声明方式牵扯到另一个概念就是const指针,关于指针今后可能会开文章细说(又挖坑了)。在这里意味着对于arr这个指针来说,它认为自己指向的是一个常量数组(到底是不是,无所谓),因此它无法修改数组内的值。也就是说,在sum_arr函数中,参数函数被视作只读数据,如果在该数组函数中执行类似如下所示的语句,编译器将自动报错:

arr[i] +=10;

  在不需要改写数组内容的数组函数中,建议都采用const指针做好保护措施。

转载地址:http://utlm.baihongyu.com/

你可能感兴趣的文章
NIFI大数据进阶_Kafka使用相关说明_实际操作Kafka生产者---大数据之Nifi工作笔记0036
查看>>
NIFI大数据进阶_NIFI的模板和组的使用-介绍和实际操作_创建组_嵌套组_模板创建下载_导入---大数据之Nifi工作笔记0022
查看>>
NIFI大数据进阶_NIFI监控功能实际操作_Summary查看系统和处理器运行情况_viewDataProvenance查看_---大数据之Nifi工作笔记0026
查看>>
NIFI大数据进阶_NIFI监控的强大功能介绍_处理器面板_进程组面板_summary监控_data_provenance事件源---大数据之Nifi工作笔记0025
查看>>
NIFI大数据进阶_NIFI集群知识点_认识NIFI集群以及集群的组成部分---大数据之Nifi工作笔记0014
查看>>
NIFI大数据进阶_NIFI集群知识点_集群的断开_重连_退役_卸载_总结---大数据之Nifi工作笔记0018
查看>>
NIFI大数据进阶_使用NIFI表达式语言_来获取自定义属性中的数据_NIFI表达式使用体验---大数据之Nifi工作笔记0024
查看>>
NIFI大数据进阶_内嵌ZK模式集群1_搭建过程说明---大数据之Nifi工作笔记0015
查看>>
NIFI大数据进阶_内嵌ZK模式集群2_实际操作搭建NIFI内嵌模式集群---大数据之Nifi工作笔记0016
查看>>
NIFI大数据进阶_外部ZK模式集群1_实际操作搭建NIFI外部ZK模式集群---大数据之Nifi工作笔记0017
查看>>
NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_实际操作_03---大数据之Nifi工作笔记0035
查看>>
NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_01---大数据之Nifi工作笔记0033
查看>>
NIFI大数据进阶_实时同步MySql的数据到Hive中去_可增量同步_实时监控MySql数据库变化_操作方法说明_02---大数据之Nifi工作笔记0034
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_01_实际操作---大数据之Nifi工作笔记0029
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
查看>>
NIFI大数据进阶_离线同步MySql数据到HDFS_说明操作步骤---大数据之Nifi工作笔记0028
查看>>
NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
查看>>
NIFI数据库同步_多表_特定表同时同步_实际操作_MySqlToMysql_可推广到其他数据库_Postgresql_Hbase_SqlServer等----大数据之Nifi工作笔记0053
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南001---大数据之Nifi工作笔记0068
查看>>
NIFI汉化_替换logo_二次开发_Idea编译NIFI最新源码_详细过程记录_全解析_Maven编译NIFI避坑指南002---大数据之Nifi工作笔记0069
查看>>