在C语言的语法中:实参 ( 实际参数 ) :函数的参数包括两个部分:实参 ( 实际参数 ) 和形参 ( 形式参数 )
真实传给函数的参数,叫实参。
讲得通俗易懂一点,就是在主函数中传递给函数的变量是实参。
| 例 |#include
int Add(int x, int y) //变量x和变量y为形参
{
return x + y;
}
int main()
{
int a = 10;
int b = 20;
int ret = Add(a, b); //变量a和变量b为实参
printf("a + b = %d\n", ret);
return 0;
}
实参的类型可以为: 常量,变量,表达式,函数等。
!! 值得注意的是 !!形参 ( 形式参数 ) :无论实参是哪一种类型,在我们进行调用函数时,都要确保实参有确定的值,以便把这些值传递给形参。
形参是指在函数名后的括号中的变量,用于接收实参传递的值。
形参只有在函数被调用的过程中才会实例化 ( 分配内存单元 ) ,因此当函数调用完后,出了函数的作用域 ( 指的是 { } 的范围 ) 形参就会自动销毁。
也就是说,形参只有在函数中有效在上面的代码段的Add函数中的 x 和 y 就属于形参。
二、实参与形参之间的数据传递传值:实参传递数据给形参有两种方式,一种是传值 ( 传递数值 ) ,另外一种是传址 ( 传递地址 )
若实参以传值的方式将数据传给形参,那么这时的形参充当的是实参的一份零时拷贝,在所调用的函数内部对形参的一系列 *** 作,并不能影响主函数中的实参。
| 例 |#include
void Swap(int x, int y)
{
int tmp = x;
x = y;
y = tmp;
}
int main()
{
int a = 10;
int b = 20;
printf("交换前>>a = %d b = %d\n", a, b);
Swap(a, b);
printf("交换后>>a = %d b = %d\n", a, b);
return 0;
}
由代码运行图可以看出,交换前后变量a和变量b的值并没有发生改变。
而我们所期望的是,执行完Swap函数后交换变量a和变量b的值。很明显,用传值这一方法,将实参传给形参,并没有达到我们预期的结果。
为什么会这样呢?在上图中可以看出实参 a 和 b 的的确确是把自身的数据以数值的方式传递过去给了形参 x 和 y。
x = a = 10,y = b = 20 执行完函数内部后 >> x = 20,y = 10
如果我们仔细观察会现:&a = 0x0000004ddfbcf7a4 &b = 0x0000004ddfbcf7c4 &x = 0x0000004ddfbcf780 &y = 0x0000004ddfbcf788
实参 a 和形参 x 的地址不同,实参 b 和形参 y 的地址也不同。
也就是本篇博客前提到的,在实参和形参之间是以传值的形式传递数据时,形参只是实参的一份零时拷贝,对形参的修改不能改变实参。
那么解决的办法就是接下来要介绍的传址。
传址:传址,顾名思义就是,将实参以地址的方式传递给形参。
| 例 |#include
void Swap(int* px, int* py)
{
int tmp = *px;
*px = *py;
*py = tmp;
}
int main()
{
int a = 10;
int b = 20;
printf("交换前>>a = %d b = %d\n", a, b);
Swap(&a, &b);
printf("交换后>>a = %d b = %d\n", a, b);
return 0;
}
由代码运行图可以看出,实参以传递地址的形式将数据传给形参,形参用指针变量来接收实参的地址,在Swap函数内,对指针变量实现解引用 *** 作,通过指针变量中存放的地址找到其指向的内容,从而达到修改主函数中实参数据的目的。
如果我们仔细观察会现:
&x = &a = 0x000000be5b6ffcf4 &y = &b = 0x000000be5b6ffd14
实参 a 和 b 分别将自己的地址传给形参 x 和 y,形参 x 和 y 通过地址找到他们分别的指向对象,也就是 a 和 b,借助临时变量 tmp 交换了 a 和 b 的数据。
三、传值 OR 传址介绍了实参与形参的两种传递数据的方式,那么我们怎么判断什么时候传值,什么时候传址呢?>> 如果调用函数的目的是改变主函数中实参变量时,则需要传值。
>> 如果不想改变主函数中实参变量时,则传值即可。
tips >> 形参变量的变量名可以和实参变量的变量名一样,并不会冲突。
新人写博客,如有错误望指出,十分感谢!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)