1

我正在看一场讲座,当教授说这 ptr=&x表示ptr分配了变量地址的变量时,我感到困惑x。并且因为y=*ptr+1 他说*ptr表示存储在的值x(或 的值x)。我在这里有点困惑,因为*ptr应该指向x正确的地址,而不是存储在的值x?有人可以详细说明一下吗?

4

5 回答 5

6

考虑,

int a = 10;

现在,在记忆中,我们有类似的东西

                   +------+
                   |      |
                   |  10  |
                   |      |
                   +------+
               0x121  a

现在,考虑一个类型的指针变量int

int* ap = &a;

这看起来像,

                +-------+
                |       |
                |  10   |
                |       |
          0x121 +-------+
                    a  

                +-------+ 
                |       |     
                | 0x121 |
                |       |
                +-------+
                   ap

a是内存位置的标签,ap是地址。要获取该地址的值,请使用*. 这称为取消引用指针。

*ap 

这给你10

阅读一些关于指针的好教程。

于 2013-05-17T18:53:51.250 回答
2

指针指向存储值的地址。

int *ptr;
int x = 2;
ptr = &x;

在这里, ptr 是一个 int 指针,而 x 是一个 int (显然)。如果我们希望 ptr “跟踪” x 的值,那么我们将 ptr 分配给 x 的地址。因此,当我们取消引用 ptr 时,我们会获得存储在 ptr 指向的地址的值。因此,如果我们想更改 ptr “存储”的值,那么我们取消引用它。

*ptr = 5;

这会将地址 ptr 指向的值从 2 更改为 5。

于 2013-05-17T23:05:16.733 回答
2

鉴于:

int x = 42;
int *ptr = &x;

x是一个整数对象(类型int),并且ptr是一个指针对象(类型int*指向-int的指针)。

一元&是地址运算符。将它应用于一个类型的对象FOO会给你该对象的地址(或者,等效地,一个指向该对象的指针);该地址/指针值的类型为FOO*,或指向-FOO。一元的操作数&必须是一个对象的名字,而不仅仅是一个值;&42是非法的废话。(该符号&也用于二进制位运算符,与地址运算符完全无关。)

一元*解引用运算符,是 的倒数&。它的操作数必须是某种指针类型的值。*ptr指的是指向的对象ptr

鉴于上述声明,并假设 的值ptr没有改变,表达式x*ptr意思相同;它们都引用同一个int对象(其值恰好是 42)。同样,表达式&xptr意思相同;它们都产生 的地址x,该地址已存储在指针对象ptr中。

重要的是要注意,*ptr它不仅仅指 的当前x它指的是对象x本身——就像名字x一样。如果您*ptr在值上下文中使用,这无关紧要;你只会得到x. 但是,如果你在赋值的左侧使用它,例如,它不会计算为42. 它评估对象x本身,并允许您修改该对象。(这里的区别是是否*ptr用作左值。)

于 2013-05-17T23:19:33.920 回答
2

ptrx,不是*ptr*ptr甚至不是一个指针(假设x不是一个)。

变量ptr包含一个指向变量的指针x,即变量的地址x。表达式的值ptr是指向 的指针x。表达式*ptr的值是指向位置的值ptr:这就是解引用运算符的*含义。由于ptr指向x,所以 的值*ptr就是 的值x

于 2013-05-17T18:44:04.470 回答
1

该变量ptr存储的地址x为了检索存储在的值x,我们使用一元运算符取消引用 ;因此,表达式的计算结果为 的值。 ptr* *ptrx

换句话说,如果

 p == &x;

然后

*p == x;
于 2013-05-17T19:52:34.793 回答