C语言形参和实参的陷阱

来源:互联网 发布:c语言求5个数平均值 编辑:程序博客网 时间:2024/05/23 00:02

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

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

}

}

 

原创粉丝点击