当教授说,我正在看一个讲座并感到困惑
ptr=&x
表示变量ptr
分配了变量x
的地址。
对于y=*ptr+1
,他说*ptr
表示存储在x
(或x
的值)的值。
我在这里稍微感到困惑,因为*ptr
应该指向x
的地址,而不是存储在x
的值?有人可以详细说明一下吗?
答案 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
的值未被更改,表达式ptr
和x
意味着相同的事情;它们都引用相同的*ptr
对象(其值恰好为42)。同样,表达式int
和&x
意味着相同的事情;它们都产生ptr
的地址,这是一个存储在指针对象x
中的地址。
重要的是要注意ptr
不只是引用*ptr
的当前值,而是指对象x
本身 - 只是就像名字x
一样。如果在值上下文中使用x
,这无关紧要;你只需获得*ptr
的价值。但是,如果您在作业的左侧使用它,例如,它不会评估为x
。它评估对象42
本身,并允许您修改该对象。 (这里的区别在于x
是否用作左值。)