C语言形参和实参的陷阱

下面用一个小程序来进行说明:

#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;

}

}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值