10

我正在阅读C++ Primer,我注意到有一个声明说:

因为引用不是对象,所以它们没有地址。因此,我们可能不会定义指向引用的指针。

但我只是写了一个示例代码,并表明可以创建一个指向引用(d变量)的指针。

代码贴在下面:

#include <iostream>
using namespace std;

int main(){
   int a = 1024;

   int &b = a; // a reference to int
   int &c = b; // a reference to another reference
   int *d = &b; // a pointer to a reference
   int *(&e) = d; // a reference to a pointer 

   a = 100;
   cout << b << endl;
   cout << c << endl;
   cout << *d << endl;
   cout << *e << endl;
}

那么,我的测试有什么问题吗?还是里面的说法C++ Primer有误?

我正在读C++ Primer第五版。该声明在第 52 页 2.3.2 中。

4

4 回答 4

10

引用是正确的,因为您正在创建一个指向原始对象的指针,而不是它的引用。下面的代码显示了这个事实:

#include <stdio.h>
#include <stdlib.h>

int main() {
  int a = 0;
  // two references referring to same object
  int& ref1_a = a;
  int& ref2_a = a;
  // creating a different pointer for each reference
  int* ptr_to_ref1 = &ref1_a;
  int* ptr_to_ref2 = &ref2_a;

  printf("org: %p 1: %p 2: %p\n", &a, ptr_to_ref1, ptr_to_ref2);

  return 0;
}

输出:

org: 0x7fff083c917c 1: 0x7fff083c917c 2: 0x7fff083c917c

如果你说你可以做一个指针供参考,那么上面的输出应该是不同的。

于 2013-06-13T21:47:55.937 回答
7

书上说的没错。您的指针指向 a,而不是引用本身 (b),因为引用本身 (b) 本身并不存在于内存中,因此没有地址。

于 2013-06-13T21:45:32.297 回答
5

不,您不能创建指向引用的指针。如果您在其上使用 address-of 运算符&,您将获得您正在引用的对象的地址,而不是引用本身。

于 2013-06-13T21:46:02.813 回答
0

将引用视为原始对象的别名。引用不分配,释放内存。正如已经指出的那样,您可以指向别名引用的对象,但是内存中没有任何内容可以表示别名本身(它仅在代码中)。相比之下,指针分配内存并存储一个值(即使该值为 NULL)。

于 2013-06-13T22:08:13.833 回答