首页 理论教育C语言函数的参数-一维数组使用技巧

C语言函数的参数-一维数组使用技巧

【摘要】:将一维数组看成一个整体作为函数参数时,用数组名作为函数的形式参数或实际参数。一维数组作为函数的形式参数本质上是一个指针变量,所以在描述上不需要指定形参数组的长度。上面程序中函数sum的原型为:int sum;,表示了该函数在被调用时应该传递一个整型数组给一维数组形式参数v[],数组的长度由整型变量n表示,函数sum的功能是将用形式参数v表示的长度为n的数组元素求和。

将一维数组(包括字符数组)看成一个整体作为函数参数时,用数组名作为函数的形式参数或实际参数。如前所述,数组在存储时有序地占用一片连续的内存区域,数组的名字表示这段存储区域的首地址。用数组名作为函数参数实现的是“传地址值调用”,其本质是在函数调用期间实际参数数组将它的全部存储区域或者部分存储区域提供给形式参数数组共享,即形参数组与实参数组是同一存储区域或者形参数组是实参数组存储区域的一部分。直观地说,就是同一个数组在主调函数和被调函数中有两个不同(甚至相同)的名字。

如果需要把整个实参数组传递给被调函数中的形参数组,可以使用实参数组的名字或者实参数组第一个元素(0号元素)的地址(参见图6.8)。

一维数组作为函数的形式参数本质上是一个指针变量,所以在描述上不需要指定形参数组的长度

图6.8 数组存储区域全部共享时形参数组与实参数组的关系

【例6.13】 编写求和函数并通过该函数求数组的元素值和。

上面程序中函数sum的原型为:int sum(int v[],int n);,表示了该函数在被调用时应该传递一个整型数组给一维数组形式参数v[],数组的长度由整型变量n表示,函数sum的功能是将用形式参数v表示的长度为n的数组元素求和。主函数通过函数调用表达式sum(a,N)调用函数sum,调用时将数组名作为实际参数(也可以用&a[0]作为实际参数)传递给函数sum的形参数组v。数组v本质上是一个指针变量,通过参数传递获取了主调函数中数组a的首地址,从而可以操作a数组,可以认为形式参数v就是实际参数a数组在函数sum中的另外一个名字,在sum函数中操作v数组实质上就是操作主调函数中的a数组,程序执行的结果为:total=55。

函数调用时用数组的某一个元素地址值作为实际参数传递给形式参数数组,可以实现将实参数组自某一元素开始后面所有的区域提供给形参数组共享的目的(参见图6.9),下面的例6.14程序展示了这种用法。

图6.9 数组存储区域部分共享时形参数组与实参数组的关系

【例6.14】 编写求和函数并通过该函数求数组自某一元素后的所有元素值和,起始点元素序号从键盘上输入。

比较例6.14和例6.13的程序,可以发现函数sum没有任何改变,程序中有所改变的是主调函数中的调用表达式:sum(&a[pos],N-pos),其中,参数&a[pos]表示将数组a自a[pos]元素以后的元素全部提供给形参数组共享,N-pos是传递到函数add中共享的数组元素个数,请读者结合图6.9自行分析程序运行方式。(www.chuimin.cn)

在前面章节关于函数的讨论中我们知道,一个函数通过其返回机制仅能返回一个值。如果期望通过一个函数的执行能够获取多个数据,就需要使用指针参数来达到目的。如果需要通过函数执行获取的数据非常多,势必造成函数的参数表十分臃肿。这种情况下,通过数组参数可以大大简化程序的设计。下面的例6.15展示了通过函数数组参数获取多个值的用法。

【例6.15】 反复从键盘上输入若干字符串(直到输入空串为止),统计所输入的字符串中每一个小写英文字母出现的次数。

在上面程序中,函数count使用了两个数组参数,其中s参数用于接收传递到函数中处理的字符串,c参数用于统计的实参数组counter。函数中,当判断一个字符s[i]是小写英文字母时,通过s[i]-'a'计算出对应的计数器(计数器数组元素)位置,将该计数器值增加1。