如果值存储在一个地址中,那么这个声明会做什么
int a = 10;
它将值存储在& 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)
作为证明,将值存储在不在的地址中。
答案 0 :(得分:3)
在某一点上你是对的:a
存储int
并住在地址&a
。
但间接只能用于指针。所以你可以做任何一个
int a = 10;
int *p = &a;
printf("%d", a);
printf("%d", *(&a));
printf("%d", *p);
答案 1 :(得分: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
也有自己的地址。
答案 2 :(得分:0)
这里的问题并不是很清楚,所以我只是解释一下情况......
每个(全局)变量都位于内存中的某个位置。当为其分配值时,该值将在内存中变量的位置。
如果您在C中使用变量,则实际使用存储在变量位置的值。
一种看待这种情况的方法是,如果&
获取对象的地址,并且*
取消引用(跟随)指针,则* &a
与简单{{1}相同}}
答案 3 :(得分:0)
当你这样做时
int a = 10;
编译器分配足够大小的内存以容纳int
。此位置必须标识(这是在此特定位置,即地址),标记为(此位置称为a
)。然后存储数据在那时候。标签可让您更轻松地访问。如果语言的设计方式只能通过指针访问位置(即取消引用它们来获取值),那将很困难。
你可以这样说,你生活在一块可以精确经纬度精确定位的土地上。但最好是保留该位置的名称,MyHouse等,而不是每次都指纬度/经度。 name和longi / lati都指的是同一个东西。
a
是标签。 &a
更像是longi / lati
修改关于int b[10]
。数组名称不是普通标签。它们也充当指针,因此您可以使用*
取消引用它们
答案 4 :(得分:0)
首先,你不能在任何没有指针类型的东西上使用间接运算符。
请记住,C语句中的声明基于表达式的类型,而不是对象;宣言
int a = 10;
表示表达式 a
的类型为int
,并将评估为10
的值(至少在有人为其指定不同的值之前) )。所以当你写
printf("%d\n", a);
编译器知道检索存储在绑定到表达式a
的内存位置的值。将此视为直接访问。
现在考虑声明
int *p = &a;
此声明表示表达式 *p
的类型为int
,并将评估当前指向的任何p
的值(在这种情况下) ,*p
评估为10
,因为p
初始化为a
的地址;间接运算符是声明的一部分(并且绑定到声明符*p
,而不是类型说明符int
)。变量p
是一个整数的指针,它存储另一个整数变量的地址(在这种情况下,变量{{1}的地址}})。因此,如果我们想要访问整数值,我们必须取消引用 a
:
p
这是对值printf("%d\n", *p);
的间接访问权限;我们不是通过变量10
访问它,而是通过指向 a
的{{1}} 访问它。