C ++ - * p vs& p vs p

时间:2012-03-12 03:08:41

标签: c++ pointers

我仍在努力理解* p,& p和p之间的区别。根据我的理解,*可以被认为是“价值指向”,而且&作为“地址”。换句话说,*保持价值而&持有地址。如果这是真的,那么* p和p之间的区别是什么?是不是p持有某些东西的价值,就像* p?

一样

5 个答案:

答案 0 :(得分:7)

*运算符用于间接。间接意味着p中的值被解释为内存地址,并加载该地址的值。 pp的值,而*pp指向的内存位置中存储的值。如果要间接访问整数i的值,可以使用指向它的整数指针(int *p = &i)并使用该指针间接修改i的值({ {1}})。

答案 1 :(得分:5)

这是一张图。

  &p=0xcafebabe        p=0xfeedbeef         *p=0xdeadbeef    <-- memory address

+--------------+    +---------------+    +----------------+
| p=0xfeedbeef | -> | *p=0xdeadbeef | -> | **p=0x01234567 |  <-- memory contents
+--------------+    +---------------+    +----------------+

因此,&pp的地址,即0xcafebabe。内存位置0xcafebabe存储p p的值,即0xfeedbeef。这也是*p的地址。

请在我之后重复:p的值是*p的地址。

而且,&p的值是p的地址。

而且,*p的值是**p的地址。

依此类推。因此,*&就像对立面一样,*&p == p == &*p,除非您通过运算符重载执行有趣的事情。

答案 2 :(得分:1)

我给你举个例子: int q=12; int *p=&q; int *pp; pp=&q;

技术上*&没有任何内容,因为它们都对变量进行操作。 *将提取值,&将提取地址。 挖掘指针魔力的最好方法是调试。

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

什么是指针?

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

我希望对指针的这种解释将有助于一些人更好地理解。像this这样的绘图有助于理解指针移动时的++或 - 运算符。指针变量的值增加或减少,因此指针指向的地址(指向的存储单元)在上面的user3231318表示中向上或向下移动