C++随记(六)---函数处理数组的一些问题

来源:互联网 发布:藏宝库源码 编辑:程序博客网 时间:2024/06/04 19:53

作者:teeyohuang

邮箱:teeyohuang@163.com

本文系原创,供交流学习使用,转载请注明出处,谢谢

C++随机(六)---函数处理数组的一些问题

本篇讨论数组做函数形参的情况。

通常,我们按照以往设置形参的习惯,可能会对数组形参做如下的书写:

int example( int arr[ ], int n); //arr是一个数组名,n是这个数组的大小

但仔细想一下,arr作为数组名应该是一个指针才对,而实际上,更标准的函数头应该是这样的:

int example(int *arr, int n);
其中用 int *arr 替代了 int arr[ ],
这两个函数头其实都是正确的,在C++中,当且仅当 用于函数头或者函数原型中, int arr[ ]和int *arr 的含义是相同的,都意味着arr是一个int类型的指针。
只不过,用 int arr[ ]其实能够提醒我们,在这里arr不但是一个指针,而且是指向一个 int数组的首元素的指针,说白了就是告诉我们,这里应该是一个数组而不是普通的指针形参。所以在实际编程中,使用数组表示法其实更容易理解程序。


数组作为形参发生了什么?

实际上,数组作为形参的时候,函数并没有把数组的内容传递过来,而是通过另一种方式来对这个数组进行操作,(int arr[ ], int n)将数组的位置(首元素的地址)、数组的类型(此处是int)、数组的大小(即元素个数n)这三个关键信息传递过来了,这样实际有点类似与按指针传递,所以常规变量的形参,实际是对改变量的一个拷贝(值传递),而数组作为形参时,是对原来的数组进行操作(指针传递)。
熟悉C++值传递和指针传递的朋友应该马上就明白这个意思了。这个问题在二级或者期末考试中已经被考烂了。

将数组名与指针对应的好处在于:如果我每次都是要像常规变量一样做一个数组的拷贝,内存的开销就比较大了,函数并不是每次都对数组的所有元素进行操作啊,而指针传递的话,相当于是对原数组进行操作,并没有开辟新的内存。


注意:为将数组类型和元素数量告诉数组处理函数,务必通过两个不同的参数来传递它们:

int exam( int arr[ ], int n);//  right!int exam(int arr[n]);//  wrong!