函数参数传递的原理

电子说

1.2w人已加入

描述

参数传递,是在程序运行过程中,实际参数就会将参数值传递给相应的形式参数,然后在函数中实现对数据处理和返回的过程,方法有按值传递参数,按地址传递参数和按数组传递参数。

形参:指出现在Sub 和Function过程形参表中的变量名、数组名,该过程在被调用前,没有为它们分配内存,其作用是说明自变量的类型和形态以及在过程中的作用。形参可以是除定长字符串变量之外的合法变量名,也可以带括号的数组名。

实参:实参就是在调用Sub 和Function过程时,从主调过程传递给被调用过程的参数值。实参可以是变量名、数组名、常数或表达式。在过程调用传递参数时,形参与实参是按位置结合的,形参表和实参表中对应的变量名可以不必相同,但它们的数据类型、参数个数及位置必须一一对应。

等号、函数名称、括弧和参数,是函数的四个组成部分。

函数“=SUM(1,2,3)”,1、2和3就是SUM函数的参数,没有参数1、2、3,函数SUM则无从求值。

函数“=VLOOKUP(2,A:C,3,)”,没有参数2、A:C和3,函数VLOOKUP如何在A:C区域查找A列中是2那一行第3列的数值?

当然,也有不需要参数的函数,如“=PI()”、“=NOW()”、“TODAY()”等。

函数参数传递的原理

C语言中参数的传递方式一般存在两种方式:一种是通过栈的形式传递,另一种是通过寄存器的方式传递的。这次,我们只是详细描述一下第一种参数传递方式,另外一种方式在这里不做详细介绍。

首先,我们看一下,下面一个简单的调用例程:

int Add (int a, int b, int c)

{

return a+b+c;

}

void main()

{

int x =0 , y = 1, z = 2;

int result = 0;

result = Add(x, y, z);

printf(“Result for x+y+z %d”, result);

}

借助以上例程,我们具体看一下,参数是如何传递的。首先,我们了解一个知识点,就是“()”操作符在C语言中有很多含义,比如说,结合符、函数调用符等。那么在result = Add(x,y,z)语句中当然为函数调用符,因此在编译阶段,遇到函数调用符后的执行序为,从最后一个参数开始压栈,压栈顺序为z-》y-》x, 直到将全部的参数压到调用栈中,然后call到Add对应的函数地址开始执行。那么压栈执行完成后,栈空间,从上到下依次的顺序为x-》y-》z(因为栈的生长方向为向上,即地址低的地方,因此,x在地址最低的地方,即栈顶)。因此,在被调用函数中参数的读取和操作也都是发生在栈中的。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 相关推荐

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分