c语言函数参数处理方式 c语言函数参数是什么意思( 二 )


【c语言函数参数处理方式 c语言函数参数是什么意思】本程序首先定义了一个实型函数aver , 有一个形参为实型数组a,长度为5 。在函数aver中,把各元素值相加求出平均值,返回给主函数 。主函数main 中首先完成数组sco的输入,然后以sco作为实参调用aver函数,函数返回值送av,最后输出av值 。从运行情况可以看出 , 程序实现了所要求的功能 。
3) 前面已经讨论过,在变量作函数参数时 , 所进行的值传送是单向的 。即只能从实参传向形参,不能从形参传回实参 。形参的初值和实参相同,而形参的值发生改变后,实参并不变化,两者的终值是不同的 。而当用数组名作函数参数时,情况则不同 。由于实际上形参和实参为同一数组,因此当形参数组发生变化时,实参数组也随之变化 。当然这种情况不能理解为发生了“双向”的值传递 。但从实际情况来看,调用函数之后实参数组的值将由于形参数组值的变化而变化 。为了说明这种情况,把【例5.4】改为【例5.6】的形式 。
【例8-9】题目同【例8.7】 。改用数组名作函数参数 。#include stdio.hvoid nzp(int a[5]){int i;printf("\nvalues of array a are:\n");for(i=0;i5;i++){if(a[i]0) a[i]=0;printf("%d ",a[i]);}}int main(void){int b[5],i;printf("\ninput 5 numbers:\n");for(i=0;i5;i++)scanf("%d",b[i]);printf("initial values of array b are:\n");for(i=0;i5;i++)printf("%d ",b[i]);nzp(b);printf("\nlast values of array b are:\n");for(i=0;i5;i++)printf("%d ",b[i]);return 0;}
本程序中函数nzp的形参为整数组a,长度为5 。主函数中实参数组b也为整型,长度也为5 。在主函数中首先输入数组b的值,然后输出数组b的初始值 。然后以数组名b为实参调用nzp函数 。在nzp中,按要求把负值单元清0,并输出形参数组a的值 。返回主函数之后,再次输出数组b的值 。从运行结果可以看出,数组b的初值和终值是不同的,数组b的终值和数组a是相同的 。这说明实参形参为同一数组,它们的值同时得以改变 。
用数组名作为函数参数时还应注意以下几点:
①形参数组和实参数组的类型必须一致 , 否则将引起错误 。
②形参数组和实参数组的长度可以不相同 , 因为在调用时,只传送首地址而不检查形参数组的长度 。当形参数组的长度与实参数组不一致时,虽不至于出现语法错误(编译能通过),但程序执行结果将与实际不符,这是应予以注意的 。
【例8.10】如把例8.9修改如下:#include stdio.hvoid nzp(int a[8]){int i;printf("\nvalues of array aare:\n");for(i=0;i8;i++){if(a[i]0)a[i]=0;printf("%d ",a[i]);}}int main(void){int b[5],i;printf("\ninput 5 numbers:\n");for(i=0;i5;i++)scanf("%d",b[i]);printf("initial values of array b are:\n");for(i=0;i5;i++)printf("%d ",b[i]);nzp(b);printf("\nlast values of array b are:\n");for(i=0;i5;i++)printf("%d ",b[i]);return 0;}
本程序与【例8.9】程序比,nzp函数的形参数组长度改为8 , 函数体中,for语句的循环条件也改为i8 。因此,形参数组a和实参数组b的长度不一致 。编译能够通过 , 但从结果看 , 数组a的元素a[5]、a[6]、a[7]显然是无意义的 。
③在函数形参表中,允许不给出形参数组的长度,或用一个变量来表示数组元素的个数 。例如,可以写为:
void nzp(int a[])
或写为
void nzp( int a[], int n )
其中形参数组a没有给出长度,而由n值动态地表示数组的长度 。n的值由主调函数的实参进行传送 。由此 , 【例8-10】又可改为【例8-11】的形式 。
【例8-11】复制纯文本新窗口
#include stdio.hvoid nzp(int a[],int n){int i;printf("\nvalues of array a are:\n");for(i=0;in;i++){if(a[i]0) a[i]=0;printf("%d ",a[i]);}}int main(void){int b[5],i;printf("\ninput 5 numbers:\n");for(i=0;i5;i++)scanf("%d",b[i]);printf("initial values of array b are:\n");for(i=0;i5;i++)printf("%d ",b[i]);nzp(b,5);printf("\nlast values of array b are:\n");for(i=0;i5;i++)printf("%d ",b[i]);return 0;}

推荐阅读