address-of运算符是否返回变量引用的值的地址

时间:2017-04-06 06:09:53

标签: c++ c pointers memory

我在指针上阅读this chapter,并说明了以下内容:

  

变量的地址可以通过在a的名称前面获得   带有&符号(&)的变量,称为地址运算符。对于   例如:

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

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

4 个答案:

答案 0 :(得分:5)

没有对象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 ++允许你为自己的类重载运算符(其中包括&),因此在整个混合中添加了一定的复杂性。但对于原始变量,使用&将始终产生所述变量的地址。

答案 1 :(得分:2)

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

如果您真的想拥有文字的地址,可以使用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;
}

答案 2 :(得分:2)

变量就像一个有地址的容器(盒子)。您可以更改框内的内容,但不能更改框的地址。

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

每当你使用&amp;运算符它为您提供使用它的框的地址

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,编译器会给你一个错误,说明这个框不能存储整数

除了文章没有使用对象

这个词

答案 3 :(得分:1)

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

我想你可能会对“#34; object&#34;?

这个词感到困惑

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

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

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

在此代码段中,您仍然可以获得变量的地址。 C ++与Java不同,类似的代码会创建一个变量,该变量包含一个对象的地址(在Java中称为&#34;引用&#34;),存储在别处。在C ++中,MyStruct实例存储在变量。

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

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

但是运算符&为您提供变量的地址,而不是MyStruct实例的地址!要获取实例的地址,只需使用myvar,而无需操作员。