c语言形参与实参之间的传递程序不懂

p,q为x,y的指针,传的是地址,为什么a,b的地址与p,q的地址不同?
在第二次传值中,x,y的地址也与a,b的地址也不同。

#include<stdio.h>
void fun( int  *a, int *b )
{ 
    int  *c; 
    c=a; 
    a=b; 
    b=c;
    printf(" &a = %d\t&b = %d\n",&a,&b);
}
void main()
{ 
    int x=3,y=5,*p=&x,*q=&y;
    fun (p,q); 
    printf (" p = %d\t q = %d\n\n\n",p,q);
    fun (&x,&y); 
    printf(" p = %d\t q = %d\n",p,q);
}

单步调试时,打开汇编窗口,寄存器窗口,内存窗口边看边理解。

地址是内存单元的编号 是一个非负的整数 如果计算机是地址线是32位的 那么范围就是32个0到32个1 ,建议用 %p 直接16进制地址形式直接输出地址 。

当然问题其实是出在交换函数内部,你的形参是int *类型,而你 printf 还在取地址,当然不一样捏,如有帮助记得点个采纳喲