地址运算符是不是返回变量引用的值的地址

Posted

技术标签:

【中文标题】地址运算符是不是返回变量引用的值的地址【英文标题】: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() 的地址,而不是变量本身?我对变量(不是它们引用的对象)的存储方式还不是很了解,而且很可能在编译程序时根本没有使用它们。

【问题讨论】:

【参考方案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,无需运算符。

【讨论】:

以上是关于地址运算符是不是返回变量引用的值的地址的主要内容,如果未能解决你的问题,请参考以下文章

C语言中取地址跟C++中的引用是一个意思吗?

PHP变量的值类型和引用类型

基本数据类型和引用数据类型的区别是啥

为什么java是只有值传递而没有引用传递

静态成员

谁能帮我讲一下 Java中的引用类型和引用变量