我在指针上阅读this chapter,并说明了以下内容:
变量的地址可以通过在a的名称前面获得 带有&符号(&)的变量,称为地址运算符。对于 例如:
int myvar = 23...;
foo = &myvar;
我的理解是否正确,它是对象new MyStruct()
的地址,而不是变量本身?我还没有很好地理解变量(不是它们引用的对象)是如何存储的,并且在编译程序时它们很可能根本不被使用。
答案 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
,而无需操作员。