C语言的 形参(形式参数) 和 实参(实际参数)
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和num22.形参和实参的关系是什么下面用代码来说明两者的区别。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里存的是实参 ab 的地址 *px(*py) 解引用通过存放的地址找到实参a,b间接的把 a , b 修改。那么这次内存又是怎么样的呢请看画图和图片。请注意因为每次程序执行都会重新分配地址所以和上次的地址不一样。但我们可以看到px,py存放的是a,b的地址请注意这里我用第一次程序执行时分配的地址来画图说明。最后简单总结下实参和形参的关系1.形式参数是实际参数的一份临时拷贝。2.对形式参数的修改不会影响实际参数。好了到了文章的最后希望这篇文章能对你有所帮助。