1.什么是 实参(实际参数)和形参(形式参数)?
形参(形式参数): 形参是在函数定义时出现的变量名,用于接收传递给函数的值
只有调用函数时会分配内存单元 。
形参的作用域:是局部变量 ,只在函数内部有效,出了函数,形参自动销毁。
实参(实际参数): 实参是在函数调用时传递给函数的值或表达式。实参可以是常量,
变量,也可以是表达式。
下面举个简单的例子:假设我们要获取两个数中的最大值
//x 和 y 为形参 ,只在get_max里有效
int get_max(int x ,int y )
{
return (x > y ? x : y);
}
int main()
{
int num1 = 0;
int num2 = 0;
scanf("%d %d", &num1, &num2);
int ret = get_max(num1, num2); //num1 num2 为实参
printf("%d\\n", ret); //获取两个数的最大值
return 0;
}
这里的形参就是 x 和 y, 作用域 就是在get_max 函数内;
实参是num1 和 num2
2.形参和实参的关系是什么?
下面用代码来说明两者的区别。
void swap1(int x, int y)
{
int temp = 0;
temp = x;
x = y;
y = temp;
}
int main()
{
int a = 0;
int 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;
}
假设我想交换两个数字,但得到结果是:

那么问题在哪里呢,让我们来看下内存。
这是实参和形参存放的数值和地址:

我们可以看到形参的地址和实参的地址是完全不同的,那么也就是说,再怎么修改形参,
实参是不会受到影响的,因为实参和形参都有着自己的内存空间。
在内存中分布大概是这样分布,都有着独立的空间和地址,调用时只是把实参的值传给了形参。

那么问题已经找到了,出在地址的不同上(不同空间)那么我们把实参的地址传过去,问题不就解决了么。这次我们地址传过去。
//地址传递过来,就要用指针接收
void swap2(int * px, int * py)
{
int temp = 0;
temp = *px;
*px =*py; //*px *py 通过地址找到实参 a,b
*py = temp;
}
int main()
{
int a = 0;
int b = 0;
scanf("%d %d", &a, &b);
printf("交换前:a = %d b = %d\\n", a, b);
swap2(&a, &b); //传递a,b的地址
printf("交换后:a = %d b = %d\\n", a, b);
return 0;
}
我们可以看到这次成功了。原因:px , py 里存的是实参 a,b 的地址 (*px)(*py) 解引用,通过存放的地址找到实参a,b,间接的把 a , b 修改。
那么这次内存又是怎么样的呢,请看画图和图片。

请注意:因为每次程序执行都会重新分配地址,所以和上次的地址不一样。
但我们可以看到 px , py 存放的是 a, b 的地址,

请注意:这里我用第一次程序执行时分配的地址,来画图说明。
最后简单总结下实参和形参的关系:
1.形式参数是实际参数的一份临时拷贝。
2.对形式参数的修改不会影响实际参数。
好了,到了文章的最后,希望这篇文章能对你有所帮助。

