*&p和vs&p之间的区别?

时间:2018-12-26 18:51:13

标签: c pointers

int a=10;
int *p=&a;

现在看&*p,我们首先看*p的{​​{1}},然后看10 这是&10的地址或10的地址

对于a,我们首先查看*&p的地址,然后查看该地址中的值为p

但是我知道10*&p都是一样的,为什么?

5 个答案:

答案 0 :(得分:2)

让我们绘制变量:

+---+     +---+
| p | --> | a |
+---+     +---+

也就是说,p指向a

现在,如果您执行&*p,则首先取消引用p以获得a,然后获得a的地址,这将为您提供指向{{ 1}}。

如果我们采用a,则您获得*&p的地址以获取指向p的指针,然后取消引用该指针以获取p。这是指向p的指针。

因此,尽管表达式执行不同的操作,但最终结果是相同的:指向a的指针。

下降的编译器可能根本什么也不做,因为解引用运算符a和地址运算符*在一起总是会互相抵消,无论它们按什么顺序。

答案 1 :(得分:2)

考虑以下示例

int a=10;
int *p=&a;

这个

*&p

这意味着*&都被无效,并导致p只是&a

还有这个

&*p

是指首先取消引用p,该引用给出a,然后引用&,即a的地址,除了第p以外,什么都没有。

答案 2 :(得分:0)

在这种情况下,command.ExecuteNonQuery(); 采用地址(即,非正式地将“ &”添加到表达式的类型)。同时*取消引用指针(即,从表达式的类型中“删除*”)。因此:

*

因此,是的,在这种情况下,结果是相同的:指向int *p = …; p; // int * *p; // int &*p; // int * &p; // int ** *&p; // int * 的指针,因为int&被抵消了。但是,这也是组合无意义的原因:其结果与*本身相同。

答案 3 :(得分:0)

通过clockwise / spiral rule

对于*&p

             +-----+
             | +-+ |
             | ^ | |
           * & p ; |
           ^ ^   | |
           | +---+ |
           +-------+
  • 我们首先获取地址p,这是a地址的地址。
  • 然后我们取消引用该地址,它给出了a的地址。

对于&*p

             +-----+
             | +-+ |
             | ^ | |
           & * p ; |
           ^ ^   | |
           | +---+ |
           +-------+
  • 我们首先取消引用p,这给了我们a
  • 然后我们像以前一样获取地址,即a的地址。

答案 4 :(得分:0)

*&p == *(&p)&p是指向该指针或int的指针。 *(&p)是指针的指针指向的值,即p的值。要继续,**&p将打印'10'。

&*p == &(*p)其中*p是指针指向的值(a的值)。现在&a的地址,它又是p。为了更进一步,*&*p将输出a(10)的值。