tips-函数参数传递方式


 


c语言中函数参数传递方式有三种:

**1.传递变量名
**

也叫值传递,只传给形参变量的值。

传递是单向的,即这个函数执行形参期间就算改变了形参的值,也不会传回给实参

因为形参跟实参不是一个存储单元

  1. int main(){

  2. void swap(int,int);//参数为整型变量

  3. int i=3,j=4;

  4. cout<<”i=”<<i<<”,j=”<<j<<endl;

  5. swap(i,j);//变量名

  6. cout<<”i=”<<i<<”,j=”<<j<<endl;

  7. system(“PAUSE”);

  8. return 0;

  9. }

  10. void swap(int a,int b){//形参为整型变量

  11. int temp;

  12. temp=a;

  13. a=b;

  14. b=temp;

  15. }

结果为:

i=3,j=4

i=3,j=4

**2.传递指针
**

形参是指针变量,实参是一个变量的地址,调用函数时,形参指向实参的变量单元

  1. int main(){

  2. void swap(int*,int*);//参数为整型指针变量

  3. int i=3,j=4;

  4. cout<<”i=”<<i<<”,j=”<<j<<endl;

  5. swap(&i,&j);//变量地址

  6. cout<<”i=”<<i<<”,j=”<<j<<endl;

  7. system(“PAUSE”);

  8. return 0;

  9. }

  10. void swap(int *p1,int *p2){//形参为整型指针变量

  11. int temp;

  12. temp=*p1;

  13. *p1=*p2;

  14. *p2=temp;

  15. }

结果为:

i=3,j=4

i=4,j=3

调用函数时,把变量i和j的地址传递给形参p1和p2

这种方式还是值传递,只不过实参的值是变量的地址而已。而在函数中改变的不是实参的值(地址),而是改变实参地址所指向的变量的值

指针传递参数本质上是值传递的方式,它所传递的是一个地址值。值传递过程中,被调函数的形式参数作为被调函数的局部变量处理,即在栈中开辟了内存空间以存放由主调函数放进来的实参的值,从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行,不会影响主调函数的实参变量的值。(这里是在说实参指针本身的地址值不会变)

3.传递引用

  1. int main(){

  2. void swap(int&,int&);//参数为整型变量的引用

  3. int i=3,j=4;

  4. cout<<”i=”<<i<<”,j=”<<j<<endl;

  5. swap(i,j);//变量名

  6. cout<<”i=”<<i<<”,j=”<<j<<endl;

  7. system(“PAUSE”);

  8. return 0;

  9. }

  10. void swap(int &a,int &b){//形参为引用类型

  11. int temp;

  12. temp=a;

  13. a=b;

  14. b=temp;

  15. }

结果为:

i=3,j=4

i=4,j=3

而在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

引用传递与指针传递的区别:

从概念上讲。指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。

而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以引用必须在一开始就被初始化,而且其引用的对象在其整个生命周期中是不能被改变的(自始至终只能依附于同一个变量)。


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!