首页 理论教育 C51单片机高效入门-数组作为函数参数

C51单片机高效入门-数组作为函数参数

时间:2023-11-17 理论教育 版权反馈
【摘要】:用数组作函数参数有两种形式,一种是把数组元素作为实参使用;另一种是把数组名作为函数的形参或实参使用。说明:1)用数组元素作实参时,只要数组类型和函数的形参类型一致即可,并不要求函数的形参也是下标变量。2)在普通变量或数组元素作为函数参数时,变量是由编译器分配的两个不同的内存单元。数组名作函数参数时,其实是将地址进行了传送,也就是说把实参数组的首地址赋予形参数组名。

C51单片机高效入门-数组作为函数参数

前面已经讨论过如何用变量作为函数的参数,其实数组可以作为函数的参数使用,而进行数据传送。用数组作函数参数有两种形式,一种是把数组元素作为实参使用;另一种是把数组名作为函数的形参或实参使用。

1.数组元素作函数实参

它与普通变量一样,没什么区别,因此它作为函数实参时的使用方法与普通变量是相同的,在发生函数调用时,把作为实参的数组元素的值传送给形参,实现单向的值传送。

【例6-11】写一函数,统计字符串中字母的个数。

978-7-111-30335-0-Chapter06-43.jpg

例6-11中首先定义一个整型函数isalp(),并说明其形参c为字符型变量。在函数体中根据if语句判断输出相应的结果。在main函数中用一个gets语句输入字符给str,然后通过循环语句调用isalp函数,将其返回值用来统计字符串口字母的个数。

说明:

1)用数组元素作实参时,只要数组类型和函数的形参类型一致即可,并不要求函数的形参也是下标变量。换句话说,对数组元素的处理是按普通变量对待的。

2)在普通变量或下标变量作函数参数时,形参变量和实参变量是由编译器分配的两个不同的内存单元。在函数调用时发生的值传送,是把实参变量的值赋予形参变量。

2.数组名作为函数参数

用数组名作函数参数与用数组元素作实参有以下不同:

1)用数组元素作函数参数时的处理是按普通变量对待的,但用数组名作函数参数时,则要求形参和相对应的实参都必须是类型相同的数组,都必须有明确的数组说明。当形参和实参二者不一致时,即会发生错误。(www.xing528.com)

2)在普通变量或数组元素作为函数参数时,变量是由编译器分配的两个不同的内存单元。在函数调用时,实参变量的值将赋予形参变量。在用数组名作为函数参数时,不是进行值的传送,并不是把实参数组的每一个元素的值都赋予形参数组的各个元素。因为实际上形参数组并不存在,编译器不会为形参数组分配内存。看到这里,或许你会问,那么数据到底是如何传送的呢?我们曾介绍过,数组名就是数组的首地址。数组名作函数参数时,其实是将地址进行了传送,也就是说把实参数组的首地址赋予形参数组名。因此,形参数组和实参数组其实就是同一个数组,它们共同占用一段内存空间。两者之间的关系如图6-3所示。

978-7-111-30335-0-Chapter06-44.jpg

图6-3 数组元素分布

图6-3直观地显示了它们之间的关系。图中设a为整型实参数组。数组a的起始地址为2000,由此开始连续若干内存空间被a所占用。b为形参数组。当函数被调用时,进行地址传递,把实参数组a的首地址传送给形参数组名b,于是b的首地址便为2000。于是a,b两数组共占2000为首地址的一段连续内存单元。从图中还可以看出a和b下标相同的元素实际上也占相同的两个内存单元(整型数组每个元素占2个字节)。例如a[1]和b[1]都占用2002和2003单元,当然a[1]等于b[1]。类推则有a[i]等于b[i]。

【例6-12】有一个一维数组score,内放10个学生成绩,求平均成绩。

978-7-111-30335-0-Chapter06-45.jpg

978-7-111-30335-0-Chapter06-46.jpg

运行情况如下:

978-7-111-30335-0-Chapter06-47.jpg

例6-12首先定义了一个实型函数score,有一个形参为实型数组array,长度为10。在函数average中,把各元素值相加求出平均值,返回给主函数。主函数main中首先完成数组score的输入,然后以score作为实参调用average函数,函数返回值送aver,最后输出aver值。从运行情况可以看出,程序实现了所要求的功能。

3)前面我们已经讲过,在变量作函数参数时,传送的值是单向的,即只能从实参传向形参,而不能从形参传回实参。形参的初值和实参相同,如果程序中形参的值发生了改变,但实参值仍保持不变。而当用数组名作函数参数时就不一样了。由于形参和实参共享一组内存空间,因此当形参数组发生变化时,实参数组也随之变化。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈