函数的传值与传址

这里介绍一下,函数参数传递方式:传值与传址.希望看过后,大家对函数的了解更深刻.
一、传址方式:
传址方式是通过引用来实现在。还是我的习惯,用事实说话。看下面例子。

/*例1 程序开始*/
fun1(int &a,int &b)
//这里告诉编译器,这个函数是传址的,不是传值的,所以所引用的参数在函数退出后值会改变
{
int t;
t=a;
a=b;//这个函数实现两个值的交换。
b=t;
}
#include<stdio.h>
main()
{
int aa=8,bb=9;
printf("函数调用前:%d %d/n",aa,bb);
fun1(aa,bb);//运行结束后,aa=9,bb=8
printf("函数调用前:%d %d/n",aa,bb);
}
/*程序结束*/
所以,传址的参数传递,函数内可以改变其值。这是和传值的根本区别。

二、传值方式:
这是最常用的参数传递方式,看下面例子:

/*例2,程序开始*/
fun2(int a,int b)
{
int t;
t=a;
a=b;//这个函数尝试两个值的交换。
b=t;
}
#include<stdio.h>
main()
{
int aa=8,bb=9;
printf("函数调用前:%d %d/n",aa,bb);
fun2(aa,bb);//运行结束后,还是aa=8,bb=9
printf("函数调用前:%d %d/n",aa,bb);
}
/*程序结束*/

    之所以会有这样的情况出现,是因为参数传递给函数的,只是它值的一个副本,函数对副本如何使用,都不会影响到原来的值。这就是传值方式的特点。它可以避免在函数体中,有意无意地改变了原值。值的非期望发生的改变,常是一些隐性的错误发生的原因,编译器发现不了这种错误,所以只有人工慢慢查找。所以除非极其确定要通过传址改变原值,一般都用传值方式传递参数。

/*例3 程序开始*/

fun3(int *a,int *b)
/*
这里没有引用符号,所以是传值.先不要激动,说这明明是把地址传进去了,怎么会是传值呢.
听我慢慢说,如果不信,你可以跟着我做个实验
*/
{
int *t;
t=a;
a=b;//这里也常试交换。
b=t;
}
#include<stdio.h>
main()
{
int aa[3]={1,2,3};
int bb[3]={4,5,6};
printf("%d %d",aa,bb);
fun3(aa,bb);
printf("%d %d",aa,bb);
}
/*程序结束*/

    怎么样,是不是没有变?
    是的,虽然指针传进函数,能对指针所指向的单元进行改动,但对指针本身却是改变不了的.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值