两者之间是否存在某种微妙的区别:
void a1(float &b) {
b=1;
};
a1(b);
和
void a1(float *b) {
(*b)=1;
};
a1(&b);
?
它们都执行相同的操作(或从main()看来),但是第一个显然较短,但是我看到的大多数代码都使用第二种表示法。有区别吗?也许是某些对象而不是float?
两者之间是否存在某种微妙的区别:
void a1(float &b) {
b=1;
};
a1(b);
和
void a1(float *b) {
(*b)=1;
};
a1(&b);
?
它们都执行相同的操作(或从main()看来),但是第一个显然较短,但是我看到的大多数代码都使用第二种表示法。有区别吗?也许是某些对象而不是float?
Answers:
两者都一样,但是一个使用引用,一个使用指针。
是。该*
符号表示在栈上传递的是一个指针,即某物的地址。该&
说这是一个参考。效果相似但不相同:
我们来看两种情况:
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 ++调用。
在您的示例中,两个版本的功能相同。
第一个优点是在调用方是透明的。想象一下它将如何寻找运营商:
cin >> &x;
以及交换调用的外观如何丑陋
swap(&a, &b);
您要交换a和b。它看起来比您初次使用地址时要好得多。顺便说一句,bjarne stroustrup写道,引用的主要原因是在调用方增加了透明度-特别是对于操作员。还要看看下面的内容是否不再明显
&a + 10
会将10加到a的内容中,调用它的operator +,或者是否将10加到指向a的临时指针中。再加上不可能只对内置操作数(如指针和整数)不能重载运算符的可能性。参考文献使这一点很清楚。
如果您希望能够放置“ null”,则指针非常有用:
a1(0);
然后在a1中,该方法可以将指针与0比较,并查看指针是否指向任何对象。