【问题标题】:Does address-of operator return address of value referenced by the variable地址运算符是否返回变量引用的值的地址
【发布时间】:2017-04-06 06:09:52
【问题描述】:

我正在阅读关于指针的this chapter,它指出以下内容:

变量的地址可以通过在变量名前面来获得 带有与号 (&) 的变量,称为地址运算符。为了 示例:

int myvar = 23...;
foo = &myvar;

我的理解是否正确,它是对象new MyStruct() 的地址,而不是变量本身?我对变量(不是它们引用的对象)的存储方式还不是很了解,而且很可能在编译程序时根本没有使用它们。

【问题讨论】:

    标签: c++ c pointers memory


    【解决方案1】:

    没有对象23...,这是一个值。有一个名为myvar 的“对象”,它有一个地址。如果您为变量分配新值,该地址不会改变,它是变量本身的属性。

    int var = 23;
    int *foo = &var;
    var = 35; // foo isn't changed here, it holds the same address.
    
    *foo = 42; // again, foo itself isn't modified
    
    assert(var == 42); // But we modified var through the address in foo
    

    附带说明,因为您还标记了此 C++。我只想提一下,由于 C++ 允许您为自己的类重载运算符(其中包括&),因此整个组合增加了一定的复杂性。但是对于原始变量,使用& 将始终产生所述变量的地址。

    【讨论】:

    • 谢谢,我已将23... 更改为new MyStruct();,这样问题就更清楚了
    • @Maximus - 希望你没有。它使我的答案无效。而且我目前无法编辑。另外,现在您的代码完全是错误的。您不能将随机结构地址分配给整数。
    • 好的,我改回来扩展一下,我的意思是用object,不是value,但是觉得不会引起混淆
    • "C++ 允许您重载运算符(其中包括 &)" - 正因为如此,从 operator& 获得的地址实际上可能不是变量的地址,如果变量的类型决定返回其他内容(这通常用于智能指针类,如CComPtr 等)。 C++11 增加了std::addressof() 来解决这个问题,所以即使operator& 被重载,你也可以获得变量的真实地址。
    【解决方案2】:

    没有。您正在将变量myvar 的地址分配给foo。

    如果你真的想要文字的地址,你可以使用compound literals

    #include<stdio.h>
    
    int main(void)
    {
        int myvar = 23;
        int *foo = &myvar;
    
        printf ("foo          : %p\n", (void *)foo );
        printf ("myvar address: %p\n", (void *)&myvar );
    
        printf ("CL address   : %p\n", (void *)(&(int){23}) );
    
        return 0;
    }
    

    【讨论】:

      【解决方案3】:

      变量就像一个有地址的容器(盒子)。盒子里面的东西可以改,但是盒子的地址不能改。

      不同的数据类型就像不同种类的盒子(每个都有它的用途) 例如,您不能将水存储在纸板箱中,同样您也不能将名称存储在整数中

      每当您使用 & 运算符时,它都会为您提供使用它的框的地址

      int a = 5 ; // put 5 in the box a 
      int *ptr ;  // creates a special pointer box which can store addresses
      ptr = &a ; // takes the address of box a and puts it in the ptr box
      

      指针也是一个不同的盒子,可以保存地址,所以如果你只是说ptr = a,编译器会给你一个错误,说这个盒子不能存储整数

      除了文章没有使用object

      这个词

      【讨论】:

        【解决方案4】:

        是变量的地址。该值存储在变量本身中,而不是从中引用。

        我想你可能对“对象”这个词感到困惑?

        当我们谈论 C 时,“对象”的含义与 Python 或 Java 中的含义不同。在 C 中,它表示内存位置,而不是值。 (草案 C11)标准将对象定义为“执行环境中的数据存储区域,其内容可以表示值”,因此 变量 本身被称为“对象” .

        如果你在 C++ 中做类似的事情,那是同样的事情:

        MyStruct myvar = MyStruct();
        foo = &myvar;
        

        在这段代码sn-p中,你仍然得到了变量的地址。 C++ 与 Java 不同,在 Java 中,类似的代码会创建一个变量,其中包含存储在其他地方的对象的地址(在 Java 中称为“引用”)。在 C++ 中,MyStruct 实例存储在变量中。

        要让 C++ 像 Java 一样工作,并将 MyStruct 实例存储在内存中的其他位置,您需要使用显式指针:

        MyStruct* myvar = new MyStruct();
        foo = &myvar;
        

        但是操作符&amp; 将仍然给你变量的地址,而不是MyStruct 实例的地址!要获取实例的地址,只需使用myvar,无需运算符。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-13
          • 1970-01-01
          • 1970-01-01
          • 2021-09-24
          相关资源
          最近更新 更多