鱼C论坛

 找回密码
 立即注册
查看: 2189|回复: 6

[技术交流] 关于函数传值传址和引用的疑问

[复制链接]
发表于 2014-4-12 09:56:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 Tanamaz 于 2014-4-12 09:57 编辑
#include <iostream>

void swap_1(int *a, int *b)
{
        int tmp=NULL;
    tmp = *a;
    *a =*b;
    *b = tmp;
        std::cout << "swap_1交换后, a = " << *a << ", b = " << *b << "\n";

}

void swap_2(int &c, int &d)
{
        int tmp=NULL;
    tmp = c;
    c =d;
    d = tmp;
        std::cout << "swap_2交换后, c = " << c << ", d = " << d << "\n";

}

int main()
{
 
        int a = 100;
    int b= 200;
    std::cout << "交换前, a = " << a << ", b = " << b << "\n";
    swap_1(&a, &b);
    std::cout << "交换后, a = " << a << ", b = " << b<< "\n";

        std::cout << "------------------------------------------------\n";
     int c=100;
         int d=200;
         std::cout << "交换前, c = " << c << ", d = " << d << "\n";
    swap_2(c, d);
    std::cout << "交换后, c = " << c << ", b = " << d<< "\n";
    

    return 0;
}
关于以上两个函数swap_1和swap_2的问题,为什么swap_2在调用的时候直接用的是swap_2(c,d),而调用swap_1的时候是swap_1(&a,&b)?这个问题请来个老师详细分析下:loveliness:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-4-12 10:56:13 | 显示全部楼层
这是因为在引用参数中若在前面加入“&”符号,在函数体内对参数所做的改变在别的地方都可以使用。有点类似指针又不是指针,但这种方式更好用。若不加“&”,在函数体内执行完就会失效。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-13 10:49:37 | 显示全部楼层

这两个函数在调用的时候都是传递的地址,但是为什么一个要加&,一个不加。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-13 11:33:33 | 显示全部楼层
Tanamaz 发表于 2014-4-13 10:49
这两个函数在调用的时候都是传递的地址,但是为什么一个要加&,一个不加。

以下仅代表个人见解,可能有误:
我觉得在前面加入“&”,是传递地址,这样函数体内发生变化了,在函数体外也变化了。若不加“&”,则会申请多一个形式参数,当函数体执行完了,形参也会被释放。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-4-21 09:23:10 | 显示全部楼层
忠弟 发表于 2014-4-13 11:33
以下仅代表个人见解,可能有误:
我觉得在前面加入“&”,是传递地址,这样函数体内发生变化了,在函数体 ...

这是引用和指针在定义的时候的区别了。
定义一个引用是必须这样 int &b=a,这个&不是取地址符号的意思,必须在定义的时候就初始化,b就是a的一个别名了,可以理解成b不占用内存地址。定义之后用到a或者b都是同一地址同一东西了。
定义指针的时候 int *b=&a,或者可以 int *b ;  b=&a;这都是表达同一目的,所以在函数参数用到指针或者引用的时候为什么调用的时候一个要加&一个不加。就因为他们定义的时候的特殊约定。
  int &b=a  ;  int *b=&a;记住这个形式就好啦.
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-21 10:14:48 | 显示全部楼层
感谢楼主分享
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-4-21 13:18:54 | 显示全部楼层
Tanamaz 发表于 2014-4-21 09:23
这是引用和指针在定义的时候的区别了。
定义一个引用是必须这样 int &b=a,这个&不是取地址符号的意思, ...

嗯,这样更好理解,谢谢指教。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-26 01:25

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表