02.29 深入理解被调函数与主调函数之间的传值、传址、值返回、址返回

函数的英文是function,有功能的意思,函数的作用在于合理分配功能,增强程序的可读性。合理分解功能,降低程序的复杂性。隐藏函数内部的数据和实现,尽可能将问题局限于函数本身。

函数可以理解为一种功能抽象,一些语句的封装或聚合。由函数的各部分形成一个数据描述、输入、处理、输出的结构。

函数调用时都会在栈上开辟自己的内存空间(栈帧),用于存放返回地址、实参值、函数体内的局部变量。

实参和形参的结合相当于用实际参数值初始化形式参数 ,可以理解为:形参=实参(实际值或地址值),存储到栈帧。

函数的参数和返回值可以是值、指针和引用,它们有不同的作用。

函数是程序重要的模块,在函数内和函数外定义的变量(数据)分别存储于不同的内存空间,对应于不同的作用域和存续期。

模块(函数)之间的交互在于传参与函数返回,传值、传址、值返回、址返回区别如下:

深入理解被调函数与主调函数之间的传值、传址、值返回、址返回

传址或址返回可以是指针或引用,只是后者的写法更简洁(引用不能为空指针);

传址时在函数体内可以修改指针本身或指针指向的值,但前者会与主调函数无关。

如果用址传递想修改一个一级指针,则形参必须是一个二级指针或指针引用。

当然,也可以使用指针返回(而不是参数返回),这样更简洁

如果被调函数的形参是指针引用,有申请堆空间,则主调函数需要释放堆内存;

数组传递默认为传址,其它类型,包括复合类型默认为传值。

通常,从健壮性考虑,需要对函数的输入、输出做一些边界或合法性检查。

从可读性考虑,通常也要对函数的功能、输入、输出做一些注释性说明。

在C++中,函数可以重载,参数可以使用默认值,可以定义为inline;

应当说,值传递在被调函数和主调函数之间的耦合度更低,相互更独立,而值传递的效率更高。

-End-


分享到:


相關文章: