int a=10;
int *p=&a;
现在看&*p
,我们首先看*p
的{{1}},然后看10
这是&10
的地址或10
的地址
对于a
,我们首先查看*&p
的地址,然后查看该地址中的值为p
但是我知道10
和*&p
都是一样的,为什么?
答案 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)
对于*&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)的值。