是否可以定义指向引用的指针?

yeg*_*gle 10 c++ pointers reference

我正在读书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;
}
Run Code Online (Sandbox Code Playgroud)

那么,我的测试有什么问题吗?或者声明C++ Primer是错的?

我正在读C++ Primer第五版.该声明见第52页,2.3.2.

kee*_*lar 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;
}
Run Code Online (Sandbox Code Playgroud)

输出:

org: 0x7fff083c917c 1: 0x7fff083c917c 2: 0x7fff083c917c
Run Code Online (Sandbox Code Playgroud)

如果你说你能够制作一个指针供参考,那么上面的输出应该是不同的.

  • 加入通常的stackoverflow挑剔,printf应该有%p占位符,而不是%x(64位指针与32位整数,yada yada).+1无论如何要获得一个好的解释. (2认同)
  • @keelar:生活在stackoverflow ...生活和学习:-) (2认同)

Yam*_*dax 7

这本书的内容是正确的.你的指针指向a,而不指向引用本身(b),因为引用本身(b)在内存中不存在,因此没有地址.

  • 引用*可能*具有内存,例如,如果它被传递给函数 - 编译器可以在内部将其实现为指针.但是,这种实现不会暴露给您. (3认同)

Mar*_*som 5

不,你不能指向一个引用.如果在其上使用address-of运算符&,则会获得您引用的对象的地址,而不是引用本身.