将地址转换为指针时出现问题

Problems casting an address to a pointer

我明白address-of运算符&存储的是变量的实际地址。指针存储对地址的引用,我可以使用取消引用运算符 * 访问该地址。我不明白的是如何使指针指向给定地址。以下均无效。

void getDouble(double &addr) {
  // Incorrect type cast error
  std::cout << *((double *)addr) << std::endl;
  
  // Incorrect type cast error
  double *dbl = addr;
  std::cout << (double *)addr << std::endl;

从 C/C++ 中的地址获取值的正确方法是什么?

I understand that the address-of operator & stores the actual address of the variable

运算符不“存储”任何东西。当您将一个值作为内置寻址运算符的操作数传递时,结果值是指向该对象的指针。如果操作数是引用,则结果是指向引用对象的指针。

A pointer stores a reference to an address

一个指针存储一个地址。指针的值代表地址。使用间接运算符,您可以通过指针间接获取指向指向对象的左值。

// Incorrect type cast error
double *dbl = addr;

addr 是对 double 的引用。对 double 的引用不会隐式转换为指针。

// Incorrect type cast error
std::cout << *((double *)addr) << std::endl;

double 的引用甚至不会显式转换为指针。

您可以使用 addressof 运算符获取指向所引用对象的指针,如果您想要这样做的话:

double *dbl = &addr; // pointer to object referred by addr

What is the correct way to get the value from an address in C++

如果您在示例中有诸如 addr 之类的引用,那么您只需像使用任何其他值一样使用该引用。引用将被隐式间接访问,并访问引用对象的值。例如,如果要打印对象的值:

std::cout << addr;

Okay so it's different in C++, whereas in C the & strictly means address-of

了解标记在不同上下文中具有不同含义很重要。示例:

int i = 1 & 2;
//        ^--- bitwise-and operator (binary)
int* ptr = &i;
// ^       ^-- addressof operator (unary)
// ^---------- not an operator; signifies a pointer type
int i2 = *i * 42;
//       ^  ^- multiplication operator (binary)
//       ^---- indirection operator (unary)
int& ref = i;
// ^ not an operator; signifies a reference type
int i3 = ref; // automatic indirection

C++ 和 C 是不同的语言。 C 没有引用变量;该示例程序只是格式错误。最好不要根据对另一种语言的了解对一种语言做出假设。

I understand that the address-of operator & stores the actual address of the variable.

returns地址,它不会在任何地方存储地址。您需要对 store 该地址进行单独分配,例如在指针中。

A pointer stores a reference to an address

不,它存储的是实际地址。

that I can access using the dereference operator *.

您取消引用指针以访问存储在指针指向的地址处的数据。

What I am not understanding is how to make a pointer point to a given address. Non of the following have worked.

那是因为您一开始并没有真正使用 & 的地址运算符。 double &addr 声明了一个名为 addr 的引用,该引用引用了某处的 double。它不使用名为 addrdouble 的地址。引用只是一个别名,它不是指针(尽管大多数编译器会实现使用指针的引用)。

您需要使用 & 运算符(或 std::addressof())的实际地址,即使您正在处理对变量的引用。获取引用的地址 returns 所引用事物的地址。

void getDouble(double &dbl) {

  // prints the value of the double
  std::cout << dbl << std::endl;

  // prints the address of the double
  std::cout << &dbl << std::endl;

  // prints the value of the double
  std::cout << *(&dbl) << std::endl;
  
  // prints the address of the double
  double *addr = &dbl;
  std::cout << addr << std::endl;
  
  // prints the value of the double
  std::cout << *addr << std::endl;
}