打印
[ARM入门]

c/c++ 参数传递方式

[复制链接]
660|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
千岁寒|  楼主 | 2018-8-17 10:05 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
void swapA(int a, int b);

void swapB(int &a, int &b)

void swapC(int *a, int *b);


按值传递
SwapA函数被调用时,会为形参分别创建新的名为a和b的变量,并且将主调函数中实参x和y的值分别赋给a、b,这就相当于被调函数Swap为实参创建了一个副本(自然会为新变量分配内存,但这块内存与用于存储变量的普通内存不太一样)作为Swap的形参,当被调函数完成时副本即被销毁,因此对按值传递参数的方式并不会对主调函数传递过去的实参产生任何影响(Swap使用的是实参的副本,而不是原来的数据)。
        * 形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入, 不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。



按指针传递
SwapC 形参a、b的地址分别与实参p1、p2的值相同。由于指针p1、p2分别指向要交换数据的x和y(即p1、p2分别存放x和y中存放数值的地址),因此a、b也分别指向x、y,因此形参通过获取到实参传递过来的目标地址可以访问x和y,自然也就能修改其值了。
        *形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作



                                  C语言就只有以上这两种函数参数传递方式!!!!!
按引用传递
        对于前边提到例子swapB中传递基本类型的参数还看不出什么,但如果是传递复合类型的参数如结构体、类等等呢?按值传递会创建副本,对于占用内存大的参数显然不是一个好的选择,那就只剩下按指针传递了,但指针是C/C++中最为强大也最难控制的一种类型,如果在某些情况下需要用到多级指针,那么程序的可读性和鲁棒性就会大打折扣,并且对不熟悉指针的程序员来说极易造成程序安全问题(比如内存泄漏)。C++为此提供了另一种强大实用、较易理解又相对安全的类型——引用,来传递参数。
        * 形参相当于是实参的“别名”,对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
        *引用的规则:
            (1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化)。
            (2)不能有NULL引用,引用必须与合法的存储单元关联(指针则可以是NULL)。
            (3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象)。

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

72

主题

244

帖子

4

粉丝