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
    

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

  • 相关阅读:
    asp.net 遍历xml 及 Repeater 绑定xml
    通过NetworkIsolationEnumAppContainers查看安装的UWP应用
    修复 Outlook 数据文件(.pst 和 .ost)
    c# 学习笔记 抓包解析器开发
    c++ 结构体位域操作 进制转换
    《C++ Footprint and Performance Optimization》读书笔记
    SQL SERVER 2000 函数一点小注意
    一个B/S结构MIS的登录日志的问题。
    jmeter连接mysql提示Cannot create PoolableConnectionFactory(查看jmeter日志,提示SSL)如何解决
    List、Map、Set之间的联系与区别:
  • 原文地址:https://www.cnblogs.com/wendyy/p/9372480.html
Copyright © 2011-2022 走看看