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