2

如果值存储在地址中,那么这个声明做什么

int a = 10;

它将值存储在 a 或 &a 的地址中。如果它将值存储在 a 的地址中,那么为什么我们不能像这样使用对这个变量的间接寻址:

printf("%d", *a);

如果不是,那么我们怎么能说每个值都有一个唯一的地址,我们可以使用间接运算符访问它们。

编辑:如果我认为间接仅用于指针,那么考虑一下:

int b[10];
b[0] = 4;  // Give it some value

现在我们知道 b[0] 是一个标量,可以在任何需要标量值的地方使用。但是在这种情况下,我们可以像这样使用它的间接性:

printf("%d", *b);  // print 4

看到我们可以在这个标量变量上使用指针,但不能在没有数组的变量声明上使用,这并不有趣。

在我看来,编译器会自动为变量声明生成一个间接,如下所示:

int a = 4;

所以,间接是不可能的,因为我们在它上面放置了另一个不合法的间接,除非在声明变量的情况下:

int a = 4; 
int *b = &a; 
int **c = &b;

编辑2:您可以scanf("%d", &a)将值存储在a的地址中而不是a中作为证明。

4

5 回答 5

3

在某种程度上你是对的:a存储一个int并住在地址&a

但是间接只能用于指针。所以你可以做任何一个

int a = 10;
int *p = &a;
printf("%d", a);
printf("%d", *(&a));
printf("%d", *p);
于 2013-05-15T13:49:41.883 回答
2

当变量是类型int(而不是int *)时,编译器知道它需要为您执行间接寻址,您不应该尝试让它执行此操作。也就是说,当您拥有 时int a = 10;,编译器将值存储在由&a(忽略寄存器)表示的内存位置,并且它知道在您编写printf("%d\n", a);时需要&a自动获取存储在的值,而无需考虑告诉它取消引用某事。

当变量是类型int *(例如int *p)时,有两种方法可以读取该值:

  • 获取保存在其中的值(地址)p
  • 获取存储在地址中的值p

这是两个不同的操作,所以需要两个符号:

int  a = 10;
int *p = &a;
int *q = p;
int  r = *p;

当然,p也有自己的地址。

于 2013-05-15T13:51:47.007 回答
0

目前还不清楚这里的问题是什么,所以我将解释一下情况......

每个(全局)变量都位于内存中的某个位置。当它被分配一个值时,该值将在内存中的变量位置。

如果您在 C 中使用变量,则实际上使用的是存储在变量位置的值。

看到这一点的一种方法是,如果&获取一个对象的地址,并*取消引用(跟随)一个指针,那么与 simple* &a相同a

于 2013-05-15T13:52:42.390 回答
0

当你这样做

int a = 10;

编译器分配足够大小的内存来容纳int. 这个位置必须被识别(这是在这个特定的地方,即地址)和标记(这个位置被称为a)。然后它存储那个点的数据。标签使您更容易访问。如果语言的设计方式是您只能通过指针访问位置(即取消引用它们以获取值),那将很困难。

你可以说,你生活在一块土地上,可以通过精确的纬度和经度来确定。但最好为该位置保留一个名称,如 MyHouse 等,而不是每次都参考纬度/经度。name 和 longi/lati 指的是同一个东西。

a是标签。&a更像是longi/lati

编辑:关于int b[10]. 数组名称不是普通标签。它们还充当指针,因此您可以使用*它们来取消引用它们

于 2013-05-15T13:57:34.903 回答
0

首先,您不能在没有指针类型的任何东西上使用间接运算符。

请记住,C 中的声明基于表达式的类型,而不是对象;宣言

int a = 10;

表示表达式 a具有 type int,并将评估为的值10(至少在有人为其分配不同的值之前)。所以当你写

printf("%d\n", a);

编译器知道要检索存储在绑定到表达式的内存位置的值a。将此视为直接访问

现在考虑声明

int *p = &a;

这个声明说表达式 *p的类型int是 ,并且将评估p为当前指向的任何值(在这种情况下,*p将评估为,10因为p使用 的地址初始化a);间接运算符是声明的一部分(并且绑定到声明*p符,而不是类型说明符int)。该变量p是一个指向整数的指针,它存储另一个整数变量的地址(在本例中为变量的地址a)。因此,如果我们想访问整数值,我们必须取消引用 p

printf("%d\n", *p);

这是对值的间接访问10;我们不是通过变量a访问它,而是通过p 指向 a.

于 2013-05-15T14:16:26.133 回答