&和和*作为参数

时间:2011-10-06 15:43:35

标签: c++

以下两种参数类型有什么区别?第一个接受一个指针,它实际上是一个内存地址,第二个也是一个内存地址?

foo(float& bar)
{
    // do stuff
}

foo(float* bar)
{
    // do stuff
}

你能不能同时打电话:

float pow = 3.0f;

foo(&pow);

float* pow = 3.0f;

foo(pow);

5 个答案:

答案 0 :(得分:12)

  • 指针可以是NULL,而引用则不能。如果您因任何原因需要传递NULL对象,这将非常有用。

  • 使用指针语法,在调用函数时传递指针。使用引用,您只需传递变量:

    refer(float& bar) {}
    point(float* bar) {}
    
    float afloat = 1.0f;
    
    refer(afloat);
    point(&afloat);
    

    这意味着使用指针语法时,必须在调用函数时传递指针。使用引用语法,您不知道函数是通过引用还是通过值来获取它而不查看函数定义。

  • 使用参考语法,您不必取消引用函数中的指针,并在// do stuff部分更自然地使用它。

    foo(float& bar)
    {
        bar = 3.0f;
    } 
    
    // versus
    
    foo(float* bar)
    {
        *bar = 3.0f;
    }
    

答案 1 :(得分:2)

不,他们不一样。第一个是通过引用获取参数,并且会像这样调用:

float pow = 3.0f;
foo(pow) // foo can change the value of pow!

第二个接受指针,并且可以通过任何一个示例调用(两个示例都传递指针,而不是引用)。

注意:您的第二个示例,虽然它传递float*但未正确初始化pow变量,因此无法编译。相反,像这样的东西会起作用:

float *pow = new float(3.0);
foo(pow);
delete pow;

虽然引用与指针有相似之处,但并不强制它们由指针内部实现。例如,编译器通常可以内联调用并直接修改参数,在这种情况下不传递指针。

通常,将引用视为变量的“另一个名称”。例如:

Person Samuel_Clemens;
Person &Mark_Twain(Samuel_Clemens); // just another name

答案 2 :(得分:1)

不同之处在于第一个不能接收空指针,而第二个则可以。 但是通过一些努力,你也可以使第一个接收空指针:

float *a = null;
pow(*a);

编辑:以下所有内容都证明是错误的,我会将其作为评论的参考:

不同之处在于,引用版本将在取消引用空引用时引发异常,而指针版本只是段错误:

float *a = null;
float &b = *a; // works... somehow?

b = 1; // throws exception
*a = 1; // segmentation fault

<击>

答案 3 :(得分:0)

float*是浮点数的指针,而float&是浮点数的引用

使用指针,您可以说function(null)让参数指向null(它没有特别表示任何内容,并且经常导致未定义的行为(=崩溃))。引用不能引用任何内容(至少不是那么容易)。

使用float*时,您将始终将此参数视为指针,编译器也会这样做。使用float&时,可以将其视为“普通”(即非指针)变量,但就像使用指针一样。

答案 4 :(得分:0)

在第一个(参考)中,您有兴趣阅读和编写原始变量。在第二个(指针)中,您有兴趣接收原始变量的地址。

差别主要是品味,除了指针版本允许您使用NULL值不传递任何值的事实。