下面用一个小程序来进行说明:
#include <stdio.h>
void main()
{
void sort(int x,int y,int z);
int a,b,c;
scanf("%d %d %d",&a,&b,&c);
sort(a,b,c);
printf("%d %d %d\n",a,b,c);//输出结果顺序不变
}
void sort(int x,int y,int z)
{
int t1;
if(x>y)
{
t1=x;
x=y;
y=t1;
}
if(x>z)
{
t1=x;
x=z;
z=t1;
}
if(y>z)
{
t1=y;
y=z;
z=t1;
}
printf("%d %d %d\n",x,y,z); //输出顺序改变
}
在主函数中printf("%d %d %d\n",a,b,c);的结果之所以不变,是因为实参向对形参的数据传递是“值传递”,单向传递,只由实参传给形参,而不能由形参传回来给实参。在内存中,实参单元与形参单元是不同的单元。在调用函数时,给形参分配存储单元,并将实参对应的值传递给形参,调用结束后,形参单元被释放,实参单元仍保留并维持原值。因此,在执行一个被调用函数时,形参的值如果发生改变,并不会改变主调函数的实参的值。
当用指针来处理的时候,可以避免这个问题
#include <stdio.h>
void sort(int *x,int *y,int *z);
main()
{
int a,b,c;
printf("请输入三个整数:\n");
scanf("%d %d %d",&a,&b,&c);
sort(&a,&b,&c);
printf("small to big: %d %d %d\n",a,b,c);
}
void sort(int *x,int *y,int *z)
{
int t;
if (*x>*y)
{
t=*x;
*x=*y;
*y=t;
}
if(*x>*z)
{
t=*z;
*z=*x;
*x=t;
}
if(*y>*z)
{
t=*y;
*y=*z;
*z=t;
}
}