c语言中的值传递和地址传递参数,C语言中函数之间地址传递方式

导语:C语言中函数之间的数据传递方式有值传递、引用传递、地址传递。下面就由小编为大家介绍一下C语言中函数之间地址传递方式,欢迎大家阅读!

1 函数之间数据传递方式分类

C语言程序是由函数组成的。设计C语言程序时,通常将一个大的程序按功能分成若干个较小的模块,每个模块编写成结构清晰、接口简单、容易理解的程序段,即函数。这种方法可建立公用模块,消除重复工作,提高程序开发效率。[1]从函数的形式来看,函数可分为无参函数和有参函数。在调用有参函数时,主调函数与被调用函数之间有数据传递,也就是说,主调函数可以将数据传递给被调函数使用,被调函数中的数据也可以带回来给主调函数使用。

值传递:数据只能从实参单向传递给形参,称为“按值”传递。当基本类型变量作为实参时,在函数调用过程中,形参和实参占据不同的存储空间,形参的改变对实参的值不产生任何影响

引用传递:使实参和形参共用一个地址,即所谓“引用传递”。这种传递方式,无论对哪个变量进行修改,都是对同一地址内存空间的内容进行修改,其实参变量与它的引用即形参变量,总是具有相同的值。例如程序:

2 函数之间的地址传递

2.1 形参为指针变量时函数之间的数据传递。如果函数的形参为指针类型时,对应的实参类型必须与形参的基类型相同。

例如程序:调用swap函数,用指针传递的方式交换主函数中变量x和y中的数据。

函数之间值的传递是单向传递,也就是说函数只能通过实参把值传递给形参,若形参值改变,对实参不会产生影响;把数据从被调函数返回到主调函数的唯一途径就是通过return语句,且只能返回一个数据。若是采用以上通过传递地址值的方式,可以在被调用函数中对主调函数中的变量进行引用,通过改变形参的值而让实参的值得到相应改变,这样就可以实现把多个数据从被调用函数返回到主调用函数。

2.2 一维数组名作实参时函数之间的数据传递。函数之间在进行数据传递时,数组元素可以作为实参传递给形参,这时的数组元素与普通变量一样,这种传递实际上就是值的传递。在C语言中,一维数组是由若干类型相同的数组元素组成的,因为数组名本是一个地址值,通常可以把数组名作为实参传送,对应的形参就用指针变量,其基类型与数组的类型要求一致。在函数间进行数据传递时,可以通过此指针变量来引用主调函数中对应的数组元素,从而可以实现对主调函数中对应的数组元素进行数据处理。

当数组名作为实参时,函数调用arrin(a)对应的形参除了指针外,对应函数首部还可以写成arrin(int pa[])和arrin(int pa[N])两种形式。虽然说明的形式与数组的说明相同,但C编译程序时都把pa处理成以上的指针形式。另外,上例中被调用函数除了通过指针引用数组元素*(pa+i)外,还可以写成pa[i]的形式。

2.3 二维数组名作实参时函数之间的数据传递。当二维数组名作为实参时,被调函数的形参必须是一个行指针变量。例如,若主函数有以下二维数组定义:double a[M][N];则被调函数fun的首部可以是以下三种形式之一:(1)fun ( double (*pa)[N]);(2)fun (double pa[M][N]);(3)fun ( double pa[ ][N])。以上无论哪种形式,与一维数组数据传递一样,系统都将把pa处理成一个指针,但是一个行指针。其处理方式一样,系统只为形参开辟一个存放地址的存储单元。

2.4 指针数组作实参时函数之间的数据传递。当指针数组作为实参时,对应的形参应当是一个指向指针的指针。因为函数传递的是一维数组指针数组名,所以参数的定义与2.2中的一维数组名作实参的形式类似。

3 结束语

引用传递虽然可以通过改变形参的值而影响实参,操作比较灵活,但进行批量数据传递有明显缺陷。对数组多个元素以及规模较大的结构体数据进行操作,只能选用地址传递的方式,这种传递方式只需在被调函数中开辟一个存放地址的4字节的存储空间,不需要另外开辟形参的存储空间,实际参数和形式参数对应于相同的内存单元,因此,对形式参数的操作也就是对实际参数的操作。这种传递方式效率高,应用灵活,功能强大。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值