【发布时间】:2013-05-10 02:59:01
【问题描述】:
如果值存储在地址中,那么这个声明做什么
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。
【问题讨论】:
-
间接运算符的操作数必须是指向类型的指针。
-
数组名的特殊之处在于它们的作用类似于指针
-
不一定将值存储在a或&a的地址中。
a可以存储在寄存器中,或者在某些情况下可以完全优化掉。a不是地址,它是编译器可能使用内存位置实现的int变量。 -
@Caleb:是的,我知道
a不是地址,但我所说的问题是将值存储在地址中(即&a)。您可以将scanf("%d", &a)作为证明。 -
你的问题似乎是(很难说)为什么你不能说:
int a = 10; printf("%d", *a);。原因是a是int,而不是int *,也就是说,它是存储在地址&a的值,而不是地址本身。您说您知道a不是地址,但如果您知道,那么应该清楚您不能使用*a取消引用它。