Tanamaz 发表于 2014-4-12 09:56:05

关于函数传值传址和引用的疑问

本帖最后由 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:

忠弟 发表于 2014-4-12 10:56:13

这是因为在引用参数中若在前面加入“&”符号,在函数体内对参数所做的改变在别的地方都可以使用。有点类似指针又不是指针,但这种方式更好用。若不加“&”,在函数体内执行完就会失效。

Tanamaz 发表于 2014-4-13 10:49:37

忠弟 发表于 2014-4-12 10:56 static/image/common/back.gif
这是因为在引用参数中若在前面加入“&”符号,在函数体内对参数所做的改变在别的地方都可以使用。有点类似指 ...

这两个函数在调用的时候都是传递的地址,但是为什么一个要加&,一个不加。

忠弟 发表于 2014-4-13 11:33:33

Tanamaz 发表于 2014-4-13 10:49 static/image/common/back.gif
这两个函数在调用的时候都是传递的地址,但是为什么一个要加&,一个不加。

以下仅代表个人见解,可能有误:
我觉得在前面加入“&”,是传递地址,这样函数体内发生变化了,在函数体外也变化了。若不加“&”,则会申请多一个形式参数,当函数体执行完了,形参也会被释放。

Tanamaz 发表于 2014-4-21 09:23:10

忠弟 发表于 2014-4-13 11:33 static/image/common/back.gif
以下仅代表个人见解,可能有误:
我觉得在前面加入“&”,是传递地址,这样函数体内发生变化了,在函数体 ...

这是引用和指针在定义的时候的区别了。
定义一个引用是必须这样 int &b=a,这个&不是取地址符号的意思,必须在定义的时候就初始化,b就是a的一个别名了,可以理解成b不占用内存地址。定义之后用到a或者b都是同一地址同一东西了。
定义指针的时候 int *b=&a,或者可以 int *b ;b=&a;这都是表达同一目的,所以在函数参数用到指针或者引用的时候为什么调用的时候一个要加&一个不加。就因为他们定义的时候的特殊约定。
int &b=a;int *b=&a;记住这个形式就好啦.

abel 发表于 2014-4-21 10:14:48

感谢楼主分享

忠弟 发表于 2014-4-21 13:18:54

Tanamaz 发表于 2014-4-21 09:23 static/image/common/back.gif
这是引用和指针在定义的时候的区别了。
定义一个引用是必须这样 int &b=a,这个&不是取地址符号的意思, ...

嗯,这样更好理解,谢谢指教。。。
页: [1]
查看完整版本: 关于函数传值传址和引用的疑问