地址运算符是不是返回变量引用的值的地址
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;
但是操作符&
将仍然给你变量的地址,而不是MyStruct
实例的地址!要获取实例的地址,只需使用myvar
,无需运算符。
【讨论】:
以上是关于地址运算符是不是返回变量引用的值的地址的主要内容,如果未能解决你的问题,请参考以下文章