请看以下例子:
我的分析:
-
*p 是指针指向的值,&*p 是指针指向的值的地址,也就是 指针指向的当前 地址,可以理解。
-
&p是指针自己的地址, * &p就是指版针变量本身了。 那指针自己的地址的值是多少呢?
正确理解:
第一种理解:
-
* 用于语句里的指针变量时,表示指针指向的值。例如:printf("%d", *pa);
-
&用于语句里的普通变量时,表示求普通变量的地址。例如:int a; pa=&a;
-
&*pa==*&pa --用于指针变量 这里 &*pa 和 *&pa 都等于 pa, 也就是 pa指向的变量的地址,这里正好都等于变量 a 的地址
第二种理解:
-
假如pa是一个变量,*pa是以pa为地址的内存所存储的值,&(*pa)就是那个值所在的内存对应的地址, 还是pa
-
&pa就是pa变量的值所在的内存的地址(pa的地址),*(&pa)就是pa的地址对应的内存所存储的值,也是pa
总结:
针对指针变量 &* 和 *& 都是互为逆运算,等同于 * 和 & 抵消
其他的数据类型说抵消不准确:
比如:int a[10]; printf("%d", &*a)
,此时& *就不能抵消了,虽然输出的值是相等的,但是类型不同;