C语言函数调用三种方式–传值调用–引用调用和传地址调用
三种调用方式
传值
是把实参的值赋值给行参,那么对行参的修改,不会影响实参的值。
从函数调用的角度理解:
函数参数压栈的是参数的副本。任何的修改是在副本上作用,没有作用在原来的变量上。
传地址
是传值的一种特殊方式,只是他传递的是地址,不是普通的如int,那么传地址以后,实参和行参都指向同一个对象。
从函数调用的角度理解:
压栈的是指针变量的副本。当你对指针解指针操作时,其值是指向原来的那个变量,所以对原来变量操作。
传引用—c中没有,C++中才有的
真正的以地址的方式传递参数,传递以后,行参和实参都是同一个对象,只是他们名字不同而已,对行参的修改将影响实参的值.。
从函数调用的角度理解:
压栈的是引用的副本。由于引用是指向某个变量的,对引用的操作其实就是对他指向的变量的操作。
函数参数传递机制的基本理论
函数参数传递机制问题在本质上是调用函数(过程)和被调用函数(过程)在调用发生时进行通信的方法问题。基本的参数传递机制有两种:值传递和引用传递。 以下讨论称调用其他函数的函数为主调函数,被调用的函数为被调函数。
值传递(pass-by-value)过程中,被调函数的形式参数作为被调函数的局部变量处理,即在堆栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。
引用传递(pass-by-reference)过程中,被调函数的形式参数虽然也作为局部变量在堆栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过堆栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
C语言中的函数参数传递机制
在C语言中,值传递是唯一可用的参数传递机制。但是据笔者所知,由于受指针变量作为函数参数的影响,有许多朋友还认为这种情况是引用传递。这是错误的。请看下面的代码:
1 | #include <stdio.h> |
- pass_value(p1, p2)语句包含的意思是p1=a,p2=b;只是把a和b的值copy了一份给他们。
- pass_address(*p1, *p2)语句包含的意思是p1=&a,p2=&b;是把a和b的地址值copy了一份给他们。