C ++ - 了解引用和内存地址

时间:2014-07-22 21:37:09

标签: c++ memory reference

我已经阅读了引用和内存地址here之间的一些技术差异,但是我试图找到一种更抽象的方式来理解它们。考虑一下代码:

char foo = 'a';
char& bar = foo;
char& bar2 = *(char*)(&foo);
cout << bar << endl;
cout << bar2 << endl;

两种情况下的输出都是&#39; a&#39;。那么从这里得出的结论是,引用(bar2)只是一个具有相关类型(char)的内存地址(&amp; foo)吗?或者这种解释是否分崩离析?

3 个答案:

答案 0 :(得分:5)

C ++中reference的最简洁定义是:

  

它声明一个命名变量作为引用,即已经存在的对象或函数的别名。

  1. 其值与作为别名的对象相同。
  2. 其地址(由&运算符获取)与作为别名的对象的地址相同。

答案 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;

同时评估ar会产生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)

bar2bar相同,因为*(char*)(&foo)(地址为foo的值,解释为char)与{{1}相同本身。

这里要理解的重要一点是,引用基本上是一个自动解引用的指针,并且其地址不能更改。或者,换句话说,变量或内存位置的别名。

考虑一下:

foo