int *p :一级指针,表示p所指向的地址里面存放的是一个int类型的值int **p :二级指针,表示p所指向的地址里面存放的是一个指向int类型的指针(即p指向的地址里面存放的是一个指向int的一级指针)例:int a=5; //定义整形变量 int *p=&a; //定义一个指针指向这个变量 int **p1=&p; //定义一个二级指针指向p指针 printf("a=%d",a); printf("a=%d",*p); printf("a=%d",**p1);以上3行输出的值都是5 。
回过来看标题问题:*&p和&*p根据运算优先级,*&p 等价于*(&p)。&*p 等价于&(*p)。
1、如果p是int *指针变量,那么*&p = p,&*p = p,都是p,但还没定义p指向哪,存的是谁的地址。
2、如果p是一个int变量,那么*&p = p;而&*p是非法的,因为*p非法。比如int p =10;那么*&p = *(&p) = p = 10(即从p的地址取值),而&*p = &(*p) 则非法,因为p=10,*10是取内存地址为10的值,这在c语言中是不合法的。