初学者会迷惑实参与形参有什么实际区别,没详细了解又会有什么影响,我就在这详细的讲解。
涉及到了函数的传值调用与传址调用的区别。
函数的参数中分为实际参数与形式参数。
在调用函数时主函数需要给自定义函数传递参数,函数中有实参与形式之分,在主函数中的传值操作是实参,自定义函数的接收值操作是形参,形参是实参临时拷贝,修改形参对实参没有实际影响。
说白了就是实参与形参都占有独立的内存块,想修改形参值就得用指针传递地址给函数。
接下来我就用两个简单例子来实操一下
这个是正确的传参操作
void Swap(int*x,int*y)//形参
{
int tmp = *x;
*x = *y;
*y = tmp;
}
int main()
{
int a = 10;
int b = 20;
Swap(&a,&b);//实参
printf("%d %d", a, b);
return 0;
}
这个是错误的传参。
void Swap(int x,int y)//形参
{
int tmp = x;
x = y;
y = tmp;
}
int main()
{
int a = 10;
int b = 20;
Swap(a,b);//实参
printf("%d %d", a, b);
return 0;
}
上文我有说过,实参与形参都有独立的内存块,上图只传递了值而没有传递地址,所以在Swap函数中的形参与main函数中实参是不同的内存块,Swap函数中换值操作已经执行过,因为他们的栈空间不同,Swap的函数换值操作是无法被main函数所接收。
说这么多简单概括,就是对自定义函数有改值操作时,就得用指针传递地址,让自定义函数与main函数地址一致,简单说就是传址调用时自定义函数可以修改main函数的数值。
有不足的地方还请指正。