C语言中函数的数据传递

来源:互联网 发布:灵肉结合知乎 编辑:程序博客网 时间:2024/06/06 03:00

C语言中函数的数据传递方式有三种:值传递;地址传递;全局变量传递。

        在调用有参函数时,主调函数和被调用函数之间有数据传递关系。

首先认识两个概念:

1、形式参数(简称“形参”又叫“虚拟参数”):在定义函数时函数名后面括号中的变量名称。

2、实际参数(简称“实参”):在主调函数中调用一个函数时,函数名后面括号中的参数。

一、值传递方式
       
        实参向形参的数据传递是“值传递”,单向传递,只能由实参传向形参。
当形参为变量而实参为变量、某个数组元素、常量或表达式时,在函数调用过程中数据传递通常使用的是值传递方式。即在程序执行中,系统会给形参和实参分别分配内存单元,在函数调用时,程序将实参的值传递给形参,存在系统分配的内存单元中,供被调用函数使用,形参和实参使用不同的内存单元;函数执行完毕,形参不将处理后的值返回给实参,实参的值不变,被调用函数最多只能通过ruturn语句返回一个值给主调函数,形参的内存单元被释放。
       在此程序中,通过把主调函数中被调用函数名后的实参(即变量的值)赋值给被调用函数的形参(变量),由被调用函数进行处理,从而实现主调函数与被调用函数间数据的传递。在这种数据传递方式中,函数最多只能返回一个值,具有一定的局限性。
example1.
max函数:
int max(int x,int y)
{
int z;
z=x>y?x;y;
return(z);
}
主函数:

#include <stdio.h>

int main()

{int main (int x,int y);

int a,b,c;

printf("please enter two integer numbers:");

scanf("%d,%d"&a,&b);

c=max(a,b);

printf("max is %d\n",c);

return 0;

}

       主函数中max后a,b是实参。a,b是main函数中定义的变量,x,y是main函数的形式参数。实参a,b的值传递给形参x,y,在max函数中把x,y的大者赋给变量z,z的值作为函数值返回main函数,赋给变量c。

二、地址传递方式

       当函数调用时,被调用函数的形参和实参为指针变量或数组时,函数间的数据传递使用的是地址传递方式。即在程序的执行过程中,系统给实参分配存储空间;在函数调用时,将实参获得的存储空间的地址传递给形参,使形参指向同一存储空间,当形参指向存储空间的值参与被调用函数的处理,也就是实参指向存储空间的值被处理。被调用函数执行完毕返回主调函数时,由于形参和实参指向同一存储空间,形参指向的存储空间的值的变化也就是实参指向存储空间的值的变化。从而实现被调用函数返回多个值给主调函数。

        比如数组元素作实参时,向形参变量传递的是数组元素的值;数组名作为函数实参时,向形参传递的是数组首元素的地址。

example2.有一个一维数组score,内放10个学生成绩,求平均成绩。

#include <stdio.h>  
int main()  
{ float average(float array[10]);           // 函数声明  
  float score[10],aver;  
  int i;  
  printf("input 10 scores:\n");  
  for(i=0;i<10;i++)  
      scanf("%f",&score[i]);  
  printf("\n");  
  aver=average(score);                     // 调用average函数  
  printf("average score is %5.2f\n",aver);  
  return 0;  
}   
  
float average(float array[10])             // 定义average函数  
  {int i;  
   float aver,sum=array[0];  
   for(i=1;i<10;i++)  
       sum=sum+array[i];                  // 累加学生成绩  
   aver=sum/10;  
   return(aver);  
}  

       用数组名称作函数参数,应该在主调函数和被调函数分别定义数组,本例中array是形参数组名,score是实参数组名,分别在其所在的函数中定义,不能只在一方定义。

 实参数组与形参数组类型应该保持一致(这里都为float型),如不一致,结果将出错。

 在被调用函数中声明了形参数组的大小为10,但在实际上,指定其大小是不起任何作用的,因为C编译器对           形参数组大小不做检查,只是检查实参数组的首地址传给形参数组。因此,score[n]array[n]指的是同一单元。

 形参数组也可以不指定大小,在定义数组时在数组名后面跟一个空的方括号,


三、全局变量传递方式 

       全局变量是指在函数之外定义的变量。如果在函数之外定义了全局变量,则该变量的作用域从变量的定义位置开始到本源程序文件结束,在其作用域中,任何函数均可以使用全局变量。 在全局变量的作用域中,如某一函数改变了全局变量的值,则在其后使用的是改变后的全局变量的值。由于全局变量定义后,其作用域中的函数都可使用它,从而也可以实现函数间数据的传递。 在这种传递方式中,利用的是系统分配给全局变量的内存单元(即全局变量的内存单元地址不变),其实也是一种地址传递。

同样可以看example2.

       在此程序中, 变量Max、Min是全局变量,既可以在主函数中使用,也可以在被调用函数average中使用,在average函数中获得的值可以在主函数中输出。

       因为,一方面全局变量始终占据内存单元,会使程序的运行受到一定的影响;另一方面,使用全局变量与结构化程序设计的模块化原则相违背,而且全局变量使得程序各模块之间牵连太多,当一个全局变量的值被误改的时候,会给后续模块带来意外的错误。故全局变量不宜过多,而且在程序中应尽量不使用全局变量。



0 0
原创粉丝点击