那些之间是否有某种微妙的区别:
void a1(float &b) { b=1; }; a1(b);
和
void a1(float *b) { (*b)=1; }; a1(&b);
?
它们都是相同的(或者看起来似乎来自main()),但第一个显然更短,但我看到的大部分代码都使用第二种表示法.有区别吗?也许万一它是一些对象而不是浮动?
两者都是相同的,但一个使用引用,一个使用指针.
请在此处查看我的答案,以获取所有差异的完整列表.
是.该*
符号表示,什么是在栈上传递是一个指针,即,什么地址.该&
说这是一个参考.效果类似但不完全相同:
我们来看两个案例:
void examP(int* ip); void examR(int& i); int i;
如果我打电话examP
,我会写
examP(&i);
获取项目的地址并将其传递到堆栈上.如果我打电话examR
,
examR(i);
我不需要它; 现在编译器"以某种方式"传递一个引用 - 这实际上意味着它获取并传递了地址i
.那么在代码方面
void examP(int* ip){ *ip += 1; }
我必须确保取消引用指针. ip += 1
做一些非常不同的事.
void examR(int& i){ i += 1; }
总是更新的价值i
.
如需更多思考,请阅读"按参考呼叫"与"按值呼叫".该&
概念通过引用提供C++调用.
在带引用的第一个示例中,您知道b
不能为NULL.使用指针示例,b
可能是NULL指针.
但是,请注意,这是有可能通过引用传递一个空对象,但它的尴尬和被调用过程可以认为这是一个错误已经这样做了:
a1(*(float *)NULL);