C++ - *p vs &p vs p

5

我仍然在努力理解*p,&p和p之间的区别。据我了解,*可以被认为是“指向的值”,&是“地址”。换句话说,*保存值,而&保存地址。如果这是正确的,那么*p和p之间有什么区别呢?难道p不像*p一样保存某些值吗?


2
当我让七个人中的一个选择1到10之间的房屋编号时,p表示数字(1-10),&p表示我询问的那个人(1-7),而*p则是他们选择的房子(地址为p的房子)。 - qwertymk
可能是重复的问题:理解指针的障碍是什么,如何克服这些障碍? - Bo Persson
5个回答

9
* 操作符用于间接寻址。间接寻址是指将 p 中的值解释为内存地址,并加载该地址处的值。当 pp 的值时,*p 是指由 p 指向的内存位置中存储的值。如果要间接访问整数 i 的值,可以使用整数指针指向它(int *p = &i),并使用该指针间接修改 i 的值(*p = 10)。

1
谢谢 :) 对我来说,这里的关键词是间接引用! - Jon

6
这里有一张图。
  &p=0xcafebabe        p=0xfeedbeef         *p=0xdeadbeef    <-- 内存地址
+--------------+ +---------------+ +----------------+ | p=0xfeedbeef | -> | *p=0xdeadbeef | -> | **p=0x01234567 | <-- 内存内容 +--------------+ +---------------+ +----------------+
因此,&pp的地址,即0xcafebabe。内存位置0xcafebabe存储了p的值,即0xfeedbeef。这也是*p的地址。
所以请跟着我说:变量p的值是指向*p的指针。
&p的值是p的地址。 *p的值是**p的地址。
依此类推。因此,*&就像相反的操作符,*&p == p == &*p,除非您在操作符重载时做了一些有趣的事情。

2
我举个例子: int q=12; int *p=&q; int *pp; pp=&q; 从技术上讲,*&都不包含任何东西,因为它们都操作变量。 *将提取值,而&将提取地址。 挖掘指针的魔力的最佳方法是调试。

1

指针是什么?

任何变量都位于内存中的一个地址,并且该地址包含一个具有大小(一些字节2(16位),4(32位),8(64位))的值。当该变量的值是地址值时,我们将该变量称为指针。

我希望这个指针的解释能帮助一些人更好地理解。像this这样的图形可以帮助理解指针移动时的++或--运算符。指针变量的值增加或减少,因此指针所指向的地址(指向的内存单元)在上面user3231318的表示中向上或向下移动。


1
          **Adress|Data**
          00001   |12345-----|
          00002   |45678     |
          12345   |99887 <---|-------|
          6757    |33431             |
          9987    |22894<------------|

          Print(&p)----->00001
          Print(p)------>12345
          print(*P)----->99887
          Print(**p)---->22894

这个答案加上一些评论会使它更清晰,特别是对于那些已经在努力理解这个概念的人来说。 - Dan Lowe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接