【问题标题】:Problems casting an address to a pointer将地址转换为指针的问题
【发布时间】:2021-10-31 06:55:33
【问题描述】:

我了解地址运算符& 存储变量的实际地址。指针存储对我可以使用解引用运算符* 访问的地址的引用。我不明白的是如何使指针指向给定地址。以下方法均无效。

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++ 中的地址获取值的正确方法是什么?

【问题讨论】:

  • void getDouble(double &amp;addr),你有一个引用,而不是一个指针。听起来你可以使用good C++ book
  • 我理解地址操作符 -- double&amp; addr -- 那是不是地址操作符。看起来您一直在阅读 C-only 书籍,其中该符号只能表示该语言中的“地址”。
  • 在 C++ 中,相同的符号可以根据上下文有不同的含义。是的,&amp; 运算符为您提供指向对象的指针,但 double &amp;addr 是不同的上下文。在这种情况下,这意味着 addr 是对 double 的引用,并且与地址运算符无关。
  • 我假设this 是你想要的? void getDouble(double *addr) 接受指向双精度的指针,在您的示例中,它期望引用双精度。
  • 如果您只是假装 C 是 java,而 C++ 是 C#(或其他不相关的一对语言),从长远来看,它会对您有所帮助。有些代码可能看起来很相似,但实际上它们是不同的语言。这同样适用于 C 和 C++,随着它们的发展和分歧越来越大。

标签: c++ pointers reference


【解决方案1】:

我知道地址操作符 & 存储了变量的实际地址

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

指针存储对地址的引用

指针存储地址。指针的值代表地址。使用间接操作符,你可以通过一个指针间接获得一个指向被指向对象的左值。

// 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

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

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

std::cout << addr;

好吧,所以它在 C++ 中有所不同,而在 C 中 & 严格表示地址

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

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 没有引用变量;示例程序只是格式错误。最好不要根据对另一种语言的了解对一种语言做出假设。

【讨论】:

    【解决方案2】:

    据我所知,地址运算符&amp;存储了变量的实际地址。

    返回地址,它不会在任何地方存储地址。你需要一个单独的赋值来存储那个地址在某个地方,比如在一个指针中。

    指针存储对地址的引用

    不,它存储实际地址。

    我可以使用解引用运算符 * 访问。

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

    我不明白的是如何使指针指向给定地址。以下方法均无效。

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

    您需要使用&amp; 运算符(或std::addressof())的实际地址,即使您正在使用对变量的引用。获取引用的地址会返回被引用事物的地址。

    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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-03-10
      • 2022-07-07
      • 1970-01-01
      • 1970-01-01
      • 2015-04-24
      • 2012-01-24
      • 2019-03-17
      相关资源
      最近更新 更多