zoukankan      html  css  js  c++  java
  • [C++]值传递和引用传递

    概念
    在定义函数时函数括号中的变量名成为形式参数,简称形参或虚拟参数;
    在主调函数中调用一个函数时,该函数括号中的参数名称为实际参数,简称实参,实参可以是常量、变量或表达式。
    注意:

    1. C语言中实参和形参之间的数据传递是单向的值传递。
    2. 被调用函数的形参只有函数被调用时才会临时分配存储单元,一旦调用结束占用的内存便会被释放。
    3. 值传递中包括值传递和指针传递(地址值),传递的都是实参的一个拷贝。
    
    void exchange(int x, int y)
    {
    	printf("x:%d,y:%d
    ", x, y);
    	printf("&x:%x,&y:%x
    ", &x, &y);
    	printf("------------
    ");
    	int temp = x;
    	x = y;
    	y = temp;
    	printf("x:%d,y:%d
    ", x, y);
    	printf("&x:%x,&y:%x
    ", &x, &y);
    }
    
    void exchange1(int* x, int *y)
    {
    	printf("*px:%d,*py:%d
    ", *x, *y);
    	printf("px:%x,py:%x
    ", x, y);
    	printf("&px:%x,&py:%x
    ", &x, &y);
    	printf("------------
    ");
    	int temp = *x;
    	*x = *y;
    	*y = temp;
    	printf("*x:%d,*y:%d
    ", *x, *y);
    	printf("x:%x,y:%x
    ", x, y);
    	printf("&x:%x,&y:%x
    ", &x, &y);
    }
    void exchange2(int &x, int &y)
    {
    	printf("x:%d,y:%d
    ", x, y);
    	printf("&x:%x,&y:%x
    ", &x, &y);
    	printf("------------
    ");
    	int temp = x;
    	x = y;
    	y = temp;
    	printf("x:%d,y:%d
    ", x, y);
    	printf("&x:%x,&y:%x
    ", &x, &y);
    }
    int main()
    {
    	int x, y;
    	x = 3;
    	y = 5;
    	printf("x:%d,y:%d
    ", x, y);
    	printf("&x:%x,&y:%x
    ", &x, &y);
    	printf("------------
    ");
    	printf("值传递
    ");
    	exchange(x, y);
    	printf("实参
    ");
    	printf("x:%d,y:%d
    ", x, y);
    	printf("&x:%x,&y:%x
    ", &x, &y);
    
    	printf("指针传递
    ");
    	int *px, *py;
    	px = &x;
    	py = &y;
    	exchange1(px,py);
    	printf("实参
    ");
    	printf("*x:%d,*y:%d
    ", *px, *py);
    	printf("x:%x,y:%x
    ", px, py);
    	printf("&x:%x,&y:%x
    ", &px, &px);
    
    	printf("引用传递
    ");
    	exchange2(x, y);
    	printf("实参
    ");
    	printf("x:%d,y:%d
    ", x, y);
    	printf("&x:%x,&y:%x
    ", &x, &y);
    	cin.get();
    
    }
    

    值传递

    传递的参数是实参的副本主调函数向调用函数传递参数实际上只是将实参的拷贝(即临时副本)传递给了被调用函数,并不是实参本身,这样被调函数不能直接修改主调函数中变量的值,而只能修改其私有的临时副本的值。

    x:3,y:5
    &x:cff89c,&y:cff890
    ------------
    值传递
    x:3,y:5
    &x:cff7a0,&y:cff7a4
    ------------
    x:5,y:3
    &x:cff7a0,&y:cff7a4
    实参
    x:3,y:5
    &x:cff89c,&y:cff890
    
    x:3,y:5
    &x:cff89c,&y:cff890
    ------------
    指针传递
    *px:3,*py:5
    px:cff89c,py:cff890
    &px:cff7a0,&py:cff7a4
    ------------
    *x:5,*y:3
    x:cff89c,y:cff890
    &x:cff7a0,&y:cff7a4
    实参
    *x:5,*y:3
    x:cff89c,y:cff890
    &x:cff884,&y:cff884
    

    引用传递

    对引用的操作等于对其指定的对象进行操作,当将实参传递给形参时,形参就指向了实参(形参与实参同义,是它的一个别名)
    引用传递过程中,被调函数的形式参数虽然同样作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。

    引用传递
    x:5,y:3
    &x:cff89c,&y:cff890
    ------------
    x:3,y:5
    &x:cff89c,&y:cff890
    实参
    x:3,y:5
    &x:cff89c,&y:cff890
    

    参考
    值传递和引用传递-----函数参数传递的两种方式

  • 相关阅读:
    org.apache.hadoop.security.AccessControlException: org.apache.hadoop.security.AccessControlException: Permission denied:
    linux iptables跟service 命令无效解决方法
    eclipse运行C++控制台不输出结果的解决办法
    C#操作mpp文件代码参考
    vs2010 开始执行(不调试) ctrl F5 出现任意键继续
    关于gcc、glibc和binutils模块之间的关系,以及在现有系统上如何升级的总结
    NUnit在Visual Studio 2010中的配置和使用
    【转】从CSDN的趣味题学C# 3.0
    gnome3程序图标下的文字如何改大
    使用autoconf、automake等来制作一个以源代码形式(.tar.gz)发布的软件、并可在执行configure时使用自定义参数
  • 原文地址:https://www.cnblogs.com/wendyy/p/9372480.html
Copyright © 2011-2022 走看看