本质上讲,pro(int * num)和pro(int & num)传递的参数都是指针,效率应该一样。

解决方案 »

  1.   

    要把num指向的值改为10pro(int* num)
    {
    *num=10;
    }pro(int& num)
    {
    num=10;
    }
      

  2.   

    我做的试验也是这样,在实际调用函数时,int num
    第一个函数pro(&num);
    第二个函数pro(num);
    但本质上是什么意思呢?
      

  3.   

    pro(int * i)时穿指针调用
    pro(int &i)时时穿引用调用,
    在函数体内,第一个函数中的参数i是一个指针
    如果要得到i的值的话,的用*i,
    而第二个i穿进去的就是一个整数变量i
    要得到它的值的话,直接用i就行了
    再编译器实现时其实都是一个指针,可以说本质相同
    效率也没什么区别Pro(int *i)时以前C语言的风格,在那时,没有
    穿引用这个概念,在C++中增加了这中调用方式,
    其目的一是为了方便:如果都要穿指针的话,每次调用还得
    取一次改变量的地址,然后要取得它的值,又得做一次取值炒作
    如:在实现这个函数的时候
    pro(int *i)
    {
      int j=*i;  
    }
    而在调用时,又的
    int i;
    pro(&i)如果是穿引用调用
    pro(int &i)
    {
        int j=i;
    }
    调用它
    int i;
    pro(i);
    二是为了安全性,大家知道,指针这种东东是非常容易出错的
    说不定在函数调用的过程中,把该指针直到其他的地方去了,
    调试起来就很麻烦,而且可能破坏有用数据
      

  4.   

    引用参数和指针参数的作用其实是一样的
    关于参数传递方法的分析
    在VC中,有三种传递参数的方法:传值(value)、传址(address)、引用(refrence)。现对各种方法的实质进行分析。深入 
    首先看下面代码:#include <afxwin.h>
    void foo1(CPoint pt) //传值
    {
    }
    void foo2(CPoint& pt) //引用
    {
    }
    void foo3(CPoint* ppt) //传址
    {
    }void main()
    {
        CPoint pt(1,2);
        foo1(pt);
        foo2(pt);
        foo3(&pt);
    }
    1. 当调用foo1(pt)时,实际执行如下操作:mov  eax, pt.y
    push eax //把pt.y压栈
    mov ecx, pt.x
    push ecx //把pt.x压栈……如果pt含有其他成员,还要一个一个压栈
    call foo1
    add esp, 8 
    2. 当调用foo2(pt)时,实际执行如下操作:lea eax, pt //把pt的地址放到eax寄存器中
    push eax //把pt的地址压栈
    call foo2
    add esp, 4 
    3. 当调用foo3(&pt)时,执行的操作和foo2(pt)完全一样,这说明传址和引用在实现上是完全一样的。由上面分析可以看出,引用/传址的代码明显要少于传值,就是说执行效率高。浅出 
    如果对上面的代码不完全了解的话,记住下面的解释:1. 传值系统先产生一个临时变量,然后把参数值复制给该临时变量,在函数内部是对临时变量执行操作,所以你也别指望能对原参数执行什么有用的修改了。2. 引用/传址系统不产生临时变量,而是把实参地址传递到函数中,你对该参数的改变都会如实反应到原参数。如果你能确保在该函数中不应该修改该参数,那么在函数声明中把参数定义为const即可,如:void foo4(const CPoint& pt)。结论 
    尽可能用传址和引用的调用方式,不到万不得已,不要用传值的方式。例外 
    如果你的参数是简单类型(如:int,long,DWORD等,而不是类、结构对象),那么用什么方法取决于你是否需要在函数中修改参数值。
      

  5.   

    至于这么复杂吗?
    二者都是对地址的调用,一个是显式的,一个是隐式的。
    sub1(int*);
    sub2(int&);
    func()
    {
    int* a;
    int b;
    sub1(a);
    sub2(b);
    return;
    }
    明白没?
      

  6.   

    楼上的兄弟,好像是因为你理解错了才会认为如此简单吧
    所谓的地址调用,其本质是传值调用,只不过它的值一个地址
    是和传引用调用本质不同的,
    不信,可以用如下代码做实验
    Test(int * p)
    {
       p=NULL;
    }main()
    {
       int * p=new int;
       * p=4;
       test(p);
       ASSERT(p!=NULL);
       delete p;
    }
    现在明白没,我不知道所谓的显示,隐士是怎么来的,好像从来没说过这样的说法,只听说传值,传引用,可能我太孤陋寡闻了吧