参数传递(传值,传址)

本文详细探讨了C语言中传值方式和传地址的区别,重点介绍了指针变量、引用类型和数组名作为参数的特性。通过实例展示了如何正确使用这些方法进行变量交换,以及它们在效率上的优劣。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录

一、传值方式

二、传地址

2.1指针变量作形参

2.2引用类型作参数

2.3数组名作参数


参数传递有两种形式:

(1)传值方式(参数为整型、实型、字符型等)

(2)传地址(参数为指针变量、引用类型、数组名)

一、传值方式

写⼀个函数,交换两个整型变量的值
#include<stdio.h>
void Swap1(int x, int y)
{
	int tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int a = 0, b = 0;
	scanf("%d %d", &a, &b);
	printf("交换前:a=%d b=%d\n", a, b);
	Swap1(a, b);
	printf("交换后:a=%d b=%d\n", a, b);

	return 0;
}

我们发现其实没产⽣交换的效果,这是为什么呢?我们一起来调试一下。

我们发现在main函数内部,创建了a和b,a的地址是0x00cffdd0,b的地址是0x00cffdc4,在调⽤
Swap1函数时,将a和b传递给了Swap1函数,在Swap1函数内部创建了形参x和y接收a和b的值,但是 x的地址是0x00cffcec,y的地址是0x00cffcf0,x和y确实接收到了a和b的值,不过x的地址和a的地址不 ⼀样,y的地址和b的地址不⼀样,相当于x和y是独⽴的空间,那么在Swap1函数内部交换x和y的值, ⾃然不会影响a和b,当Swap1函数调⽤结束后回到main函数,a和b的没法交换。Swap1函数在使⽤的时候,是把变量本⾝直接传递给了函数,这种调⽤函数的⽅式我们之前在函数的时候就知道了,这种叫 传值调⽤
把实参的值传送给函数局部工作区相应的副本中,函数使用这个副本执行必要的功能。函数修改的是 副本的值,实参的值不变

二、传地址

2.1指针变量作形参

形参变化影响实参

#include<stdio.h>
void Swap2(int *x, int *y)
{
	int tmp = *x;
	*x = *y;
	*y = tmp;
}
int main()
{
	int a = 0, b = 0;
	scanf("%d %d", &a, &b);
	printf("交换前:a=%d b=%d\n", a, b);
	Swap2(&a, &b);
	printf("交换后:a=%d b=%d\n", a, b);

	return 0;
}

我们可以看到实现成Swap2的⽅式,顺利完成了任务,这⾥ 调⽤Swap2函数的时候是将变量的地址传递给了函数 ,这种函数调⽤⽅式叫: 传址调⽤

2.2引用类型作参数

什么是引用???

引用:它用来给一个对象提供一个替代的名字。

(1)传递引用给函数与传递指针的效果是一样的,形参变化实参也发生变化。

(2)引用类型作形参,在内存中并没有产生实参的副本,它直接对实参操作;而一般变
量作参数,形参与实参就占用不同的存储单元,所以形参变量的值是实参变量的副本。
因此,当参数传递的数据量较大时,用引用比用一般变量传递参数的时间和空间效率都好。

(3)指针参数虽然也能达到与使用引用的效果,但在被调函数中需要重复使用“*指针变量名”的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参

2.3数组名作参数

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值