以下两种参数类型有什么区别?第一个接受一个指针,它实际上是一个内存地址,第二个也是一个内存地址?
foo(float& bar)
{
// do stuff
}
foo(float* bar)
{
// do stuff
}
你能不能同时打电话:
float pow = 3.0f;
foo(&pow);
或
float* pow = 3.0f;
foo(pow);
答案 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值不传递任何值的事实。