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

本人初学C语言。题目是,输入n个正整数,然后从小到大输出。我想问的是为什么第一个程序无法排序。#include<stdio.h>voidbubble(inta[],int... 本人初学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;
}

为什么上面的不行啊!! 哪位大神能告诉下原因,感谢!!
展开
 我来答
hu3192
2017-08-17 · TA获得超过300个赞
知道小有建树答主
回答量:137
采纳率:75%
帮助的人:50万
展开全部
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;
}
调用的地方也要传递二级指针,这样才能满足交换的需求。
好好理解理解。
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式