“&”和“ * ”运算符说明
- 这两个运算符的优先级相同。
p =&i;
就是将变量i的值赋值给p,q=*p;
q获取到了p所指向变量的值。
“&*”和 “ * &”的区别:
- 假设有
int a ; p = &a;
,因为两者运算符优先级相同,按自右向左的方向结合。因此:
“&*p”先进行 “ * ”运算,“ *p”相当于变量a;在进行“&”运算,“&*p”就相当于去变量a的地址; - “ *&a”先进行“&”运算,“&a”就是去变量a的地址,然后执行“ * ”运算,“ *&a”相当于取变量a所在地址的值,实际就是变量a.
例子1:
void main(){
int *p1,*p2,*p,a,b;
scanf("%d %d",&a,&b);
p1 = &a;
p2 = &b;
if(a<b){
p = p1;
p1 = p2;
p2 = p ;
}
printf("a= %d,b= %d\n",a,b);
printf("max=%d,min = %d\n",*p1,*p2);
}
上面这个例子1展示其实是变量不变,改变的是指针变量的值,也就是p1和p2指针之间的互换。
例子2:
输入三份整数a,b,c,要求按大小顺序输出:
void swap(int *p1, int *p2) /*自定义交换函数*/
{
int temp;
temp = *p1;
*p1 = *p2;
*p2 = temp;
}
void exchange(int *pt1, int *pt2, int *pt3) /*三个数由大到小排序*/
{
if (*pt1 < *pt2)
swap(pt1, pt2); /*调用swap函数*/
if (*pt1 < *pt3)
swap(pt1, pt3);
if (*pt2 < *pt3)
swap(pt2, pt3);
}
void main()
{
int a, b, c, *q1, *q2, *q3;
puts("Please input three key numbers you want to rank:");
scanf("%d,%d,%d", &a, &b, &c);
q1 = &a; /*将变量a地址赋给指针变量q1*/
q2 = &b;
q3 = &c;
exchange(q1, q2, q3); /*调用exchange函数*/
printf("\n%d,%d,%d\n", a, b, c);
}