值传递

void swap(int x,int y)
{   int  temp;
    temp=x;
    x=y;
    y=temp;
printf("/n(swap):%d,%d/n",x,y);
}
void main()
{   int a,b;
    scanf("%d,%d",&a,&b);
       if(a<b)  swap(a,b);
    printf("/n(main):%d,%d/n",a,b);
}


这显然是一个值传递的过程。假设我们从键盘输入两个数据:5,9,先来看一下运行结果:


        (swap):9,5
        (main):5,9

按照值传递的特点,我们可以很清楚的看到,虽然在swap函数中暂时使得运行结果显示了交换后的数据,即达到了交换的目的,但实际情况却是随着swap函数的结束,被作为局部参数的形参x,y以及swap函数本身的局部参数temp都将结束其生存期,在内存中的存储空间被释放。因此实参a,b的并未受到影响,依然保持原值。
从这道程序中我们也可以学到一个方法,比如有时不需要修改实参,但是又需要被调函数所作的工作能够得以体现,就可以灵活的在被调函数中使用打印语句。因此上面的程序可以改写为:

void swap(int x,int y)
{   int  temp;
    temp=x;
    x=y;
    y=temp;
printf("/n从大到小排列的顺序为:%d,%d/n",x,y);
}
main()
{   int a,b;
    scanf("%d,%d",&a,&b);
       if(a<b)  swap(a,b);
}

在输入5,9两个数字后,得到的执行结果是:
    从大到小排列的顺序为:9,5
你看这样就可以使用相对容易理解的值传递方式,巧妙的解决问题了,并得到了想要的答案,虽然我们并未真正的让主函数中的两个变量发生改变。
再来看地址传递方式:

void swap(int *p,int *q)
{   int  temp;
    temp=*p;
    *p=*q;
    *q=temp;
}
void main()
{   int a,b;
    int *pointer_1=&a,*pointer_2=&
    scanf("%d,%d",&a,&b);
       if(a<b)  swap(a,b);
    printf("/n%d,%d/n",a,b);
}

假设我们从键盘输入两个数据:5,9,先来看一下运行结果:
        
9,5
在这个程序中用指针变量作参数,虽然传送的是变量的地址,但实参和形参之间的数据传递依然是单向的“值传递”,即调用函数不可能改变实参指针变量的值。但它不同于一般值传递的是,它可以通过指针间接访问的特点来改变指针变量所指变量的值,即最终达到了改变实参的目的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值