使用间接运算符获取值

时间:2013-05-15 13:44:08

标签: c arrays pointers

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

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)作为证明,将值存储在不在的地址中。

5 个答案:

答案 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}} 访问它。