我正在看一场讲座,当教授说这 ptr=&x
表示ptr
分配了变量地址的变量时,我感到困惑x
。并且因为y=*ptr+1
他说*ptr
表示存储在的值x
(或 的值x
)。我在这里有点困惑,因为*ptr
应该指向x
正确的地址,而不是存储在的值x
?有人可以详细说明一下吗?
5 回答
考虑,
int a = 10;
现在,在记忆中,我们有类似的东西
+------+
| |
| 10 |
| |
+------+
0x121 a
现在,考虑一个类型的指针变量int
int* ap = &a;
这看起来像,
+-------+
| |
| 10 |
| |
0x121 +-------+
a
+-------+
| |
| 0x121 |
| |
+-------+
ap
a
是内存位置的标签,ap
是地址。要获取该地址的值,请使用*
. 这称为取消引用指针。
*ap
这给你10
阅读一些关于指针的好教程。
指针指向存储值的地址。
int *ptr;
int x = 2;
ptr = &x;
在这里, ptr 是一个 int 指针,而 x 是一个 int (显然)。如果我们希望 ptr “跟踪” x 的值,那么我们将 ptr 分配给 x 的地址。因此,当我们取消引用 ptr 时,我们会获得存储在 ptr 指向的地址的值。因此,如果我们想更改 ptr “存储”的值,那么我们取消引用它。
*ptr = 5;
这会将地址 ptr 指向的值从 2 更改为 5。
鉴于:
int x = 42;
int *ptr = &x;
x
是一个整数对象(类型int
),并且ptr
是一个指针对象(类型int*
或指向-int
的指针)。
一元&
是地址运算符。将它应用于一个类型的对象FOO
会给你该对象的地址(或者,等效地,一个指向该对象的指针);该地址/指针值的类型为FOO*
,或指向-FOO
。一元的操作数&
必须是一个对象的名字,而不仅仅是一个值;&42
是非法的废话。(该符号&
也用于二进制位和运算符,与地址运算符完全无关。)
一元*
是解引用运算符,是 的倒数&
。它的操作数必须是某种指针类型的值。*ptr
指的是指向的对象ptr
。
鉴于上述声明,并假设 的值ptr
没有改变,表达式x
和*ptr
意思相同;它们都引用同一个int
对象(其值恰好是 42)。同样,表达式&x
和ptr
意思相同;它们都产生 的地址x
,该地址已存储在指针对象ptr
中。
重要的是要注意,*ptr
它不仅仅指 的当前值,x
它指的是对象x
本身——就像名字x
一样。如果您*ptr
在值上下文中使用,这无关紧要;你只会得到x
. 但是,如果你在赋值的左侧使用它,例如,它不会计算为42
. 它评估对象x
本身,并允许您修改该对象。(这里的区别是是否*ptr
用作左值。)
是ptr
指x
,不是*ptr
。*ptr
甚至不是一个指针(假设x
不是一个)。
变量ptr
包含一个指向变量的指针x
,即变量的地址x
。表达式的值ptr
是指向 的指针x
。表达式*ptr
的值是指向位置的值ptr
:这就是解引用运算符的*
含义。由于ptr
指向x
,所以 的值*ptr
就是 的值x
。
该变量ptr
存储的地址。x
为了检索存储在的值x
,我们使用一元运算符取消引用 ;因此,表达式的计算结果为 的值。 ptr
*
*ptr
x
换句话说,如果
p == &x;
然后
*p == x;