C语言 关于指针变量做函数参数的一个问题

本人初学C语言。
题目是,输入n个正整数,然后从小到大输出。 我想问的是为什么第一个程序无法排序。

#include <stdio.h>
void bubble(int a[],int n);
void swap2(int *,int *);
int main(void)
{
int i,n,a[8];
printf("Enter n(n<=8):");
scanf("%d",&n);
printf("Enter n numbers into a[%d]:\n",n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
bubble(a,n);
printf("After sorted,a[%d]=",n);
for(i=0;i<n;i++)
printf("%3d",a[i]);
printf("\n");
return 0;
}
void bubble(int a[],int n)
{
int i,j,flag;
for(i=1;i<n;i++)
{
flag=0;
for(j=0;j<n-1;j++)
if(a[j]>a[j+1])
{
swap2(&a[j],&a[j+1]);
flag=1;
}
if(flag==0)
break;
}
}
void swap2(int *px,int *py)
{
int *t;
t=px;
px=py;
py=t;
}

下面的这个是可以实现的,只改动一个自定义函数

void swap2(int *px,int *py)
{
int t;
t=*px;
*px=*py;
*py=t;
}

为什么上面的不行啊!! 哪位大神能告诉下原因,感谢!!

void swap2(int *px,int *py)
{
int *t;
t=px;
px=py;
py=t;
}
swap2函数的功能是交换两个指针指向的值,
函数内部都是指针的操作,根本没有改变指针指向的值,
所以px和py指向的值没有交换。

追问

非常感谢你的回答。我还有一点没理解到,再帮帮忙吧。当bubble函数里调用swap2函数的时候不是把地址传递给了swap2了吗(相当于px=&a[j];py=&a[j+1];),既然px指向了&a[j],为什么不可以用交换地址的方式达到交换值同样的效果呢?

追答直接使用值传递的情况:
void swap2(int px,int py)
{
    int t;
    t=px;
    px=py;
    py=t;
}
显然值传递是不能交换值的。
现在把 int 换为 int*:
void swap2(int *px,int *py)
{
    int *t;
    t=px;
    px=py;
    py=t;
}
你可以理解为,只是拷贝了px和py的值,然后做了些操作,
但是并没有修改px和py的地址(指针的地址,即二级地址)指向的内容,
所以也是不能交换值的。

如果你想在函数内部改变指针的值,需要传指针的地址,也就是指针的指针。
将你的swap2函数的参数改为(int **px, int **py)
void swap2(int **px,int **py)
{
    int *t;
    t=*px;
    *px=*py;
    *py=t;
}
调用的地方也要传递二级指针,这样才能满足交换的需求。
好好理解理解。

温馨提示:答案为网友推荐,仅供参考