指派中的指针解除引用

时间:2013-05-17 16:52:17

标签: c pointers variable-assignment

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

5 个答案:

答案 0 :(得分:5)

考虑,

int a = 10;

现在,在内存中我们有类似

的东西
                   +------+
                   |      |
                   |  10  |
                   |      |
                   +------+
               0x121  a

现在,考虑类型int

的指针变量
int* ap = &a;

这看起来像,

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

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

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

*ap 

这会为您提供10

在指针上阅读一些好的tutorial

答案 1 :(得分:2)

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

变量ptr包含指向变量x的指针,即变量x的地址。表达式ptr的值是指向x的指针。表达式*ptr的值是ptr指向的位置处的值:这是取消引用运算符*的含义。由于ptr指向x,因此*ptr的值为x的值。

答案 2 :(得分:1)

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

换句话说,如果

 p == &x;

然后

*p == x;

答案 3 :(得分:1)

指针指向存储值的地址。

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

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

*ptr = 5;

这会将地址ptr处的值更改为2到5.

答案 4 :(得分:1)

假设:

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

x是一个整数对象(类型为int),ptr是一个指针对象(类型为int*指针指向 - {{ 1}} 的)。

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

一元&取消引用运算符,是*的反转。它的操作数必须是某些指针类型的值。 &指的是*ptr指向的对象。

鉴于上述声明,假设ptr的值未被更改,表达式ptrx意味着相同的事情;它们都引用相同的*ptr对象(其值恰好为42)。同样,表达式int&x意味着相同的事情;它们都产生ptr的地址,这是一个存储在指针对象x中的地址。

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