我已经阅读了引用和内存地址here之间的一些技术差异,但是我试图找到一种更抽象的方式来理解它们。考虑一下代码:
char foo = 'a';
char& bar = foo;
char& bar2 = *(char*)(&foo);
cout << bar << endl;
cout << bar2 << endl;
两种情况下的输出都是&#39; a&#39;。那么从这里得出的结论是,引用(bar2)只是一个具有相关类型(char)的内存地址(&amp; foo)吗?或者这种解释是否分崩离析?
答案 0 :(得分:5)
C ++中reference
的最简洁定义是:
它声明一个命名变量作为引用,即已经存在的对象或函数的别名。
&
运算符获取)与作为别名的对象的地址相同。答案 1 :(得分:3)
只要您在C ++中有值(即评估表达式的结果的对象),就可以将该值绑定到引用变量。稍后评估参考会产生左值,该左值恰好是绑定到参考的对象。例如:
int a = 10;
a; // the value of the expression is immediately discarded
int & r = a; // this time the value is bound to a reference variable
r; // this is the same value as a
r = 20;
同时评估a
和r
会产生int
类型的左值,这是变量a
。
另一个例子:
Foo f();
f(); // a discarded prvalue of type Foo
Foo && r = f(); // this time the value of f() is bound to r
r.do_stuff();
这一次,f()
的每次评估都会产生类型Foo
的不同值(“临时对象”)。第一个被立即丢弃;第二个绑定到引用r
。评估r
会产生类型为Foo
的左值,即从第二个函数调用返回的临时对象。
答案 2 :(得分:2)
bar2
与bar
相同,因为*(char*)(&foo)
(地址为foo
的值,解释为char
)与{{1}相同本身。
这里要理解的重要一点是,引用基本上是一个自动解引用的指针,并且其地址不能更改。或者,换句话说,变量或内存位置的别名。
考虑一下:
foo