[C++]值传递和引用传递

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

  1. C语言中实参和形参之间的数据传递是单向的值传递。
  2. 被调用函数的形参只有函数被调用时才会临时分配存储单元,一旦调用结束占用的内存便会被释放。
  3. 值传递中包括值传递和指针传递(地址值),传递的都是实参的一个拷贝。

void exchange(int x, int y)
{
    printf("x:%d,y:%d\n", x, y);
    printf("&x:%x,&y:%x\n", &x, &y);
    printf("------------\n");
    int temp = x;
    x = y;
    y = temp;
    printf("x:%d,y:%d\n", x, y);
    printf("&x:%x,&y:%x\n", &x, &y);
}

void exchange1(int* x, int *y)
{
    printf("*px:%d,*py:%d\n", *x, *y);
    printf("px:%x,py:%x\n", x, y);
    printf("&px:%x,&py:%x\n", &x, &y);
    printf("------------\n");
    int temp = *x;
    *x = *y;
    *y = temp;
    printf("*x:%d,*y:%d\n", *x, *y);
    printf("x:%x,y:%x\n", x, y);
    printf("&x:%x,&y:%x\n", &x, &y);
}
void exchange2(int &x, int &y)
{
    printf("x:%d,y:%d\n", x, y);
    printf("&x:%x,&y:%x\n", &x, &y);
    printf("------------\n");
    int temp = x;
    x = y;
    y = temp;
    printf("x:%d,y:%d\n", x, y);
    printf("&x:%x,&y:%x\n", &x, &y);
}
int main()
{
    int x, y;
    x = 3;
    y = 5;
    printf("x:%d,y:%d\n", x, y);
    printf("&x:%x,&y:%x\n", &x, &y);
    printf("------------\n");
    printf("值传递\n");
    exchange(x, y);
    printf("实参\n");
    printf("x:%d,y:%d\n", x, y);
    printf("&x:%x,&y:%x\n", &x, &y);

    printf("指针传递\n");
    int *px, *py;
    px = &x;
    py = &y;
    exchange1(px,py);
    printf("实参\n");
    printf("*x:%d,*y:%d\n", *px, *py);
    printf("x:%x,y:%x\n", px, py);
    printf("&x:%x,&y:%x\n", &px, &px);

    printf("引用传递\n");
    exchange2(x, y);
    printf("实参\n");
    printf("x:%d,y:%d\n", x, y);
    printf("&x:%x,&y:%x\n", &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

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

转载于:https://www.cnblogs.com/wendyy/p/9372480.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值