我们已经知道了如何调用一个函数,如何传参(分为实参和形参),知道了形参实例化之后是实参的一份临时拷贝。
但是,函数的调用又分为两种方式,传值调用和传址调用,接下来我们就一起来学习一下什么是传值调用,什么是传址调用!!!
一.传值调用
什么是传值调用呢?顾名思义,传值调用就是直接将实参的值传递给形参。
这样形参和实参的值是一样的,但是函数的形参和实参分别占有不同的内存块,实参是一个独立的个体,形参也是一个独立的个体,只是形参的值与实参相同。
但实际两者之间并没有建立起真正的联系,对形参的修改不会影响实参。
来举个例子:
我们来写一个函数交换两个变量的内容:
#include <stdio.h> //实现成函数,但是不能完成任务 void Swap1(int x, int y) { int tmp = 0; tmp = x; x = y; y = tmp; } int main() { int num1 = 1; int num2 = 2; Swap1(num1, num2); printf("Swap1::num1 = %d num2 = %d\n", num1, num2); return 0; }
我们来简单分析一下这段代码:
根据我们的分析,传值调用好像不能达到交换num1,num2的目的,我们看看结果是什么样的:
因此,传值调用,要想在函数内部交换两个变量的值,是不可行的。
那要怎么做呢?这里就需要传址调用。
🐵二.传址调用
那什么是传址调用呢?这里的“址”指的是地址。
传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。
那现在我们用传址调用的方法对上面的函数重新进行实现:
#include <stdio.h> //正确的版本 void Swap2(int* px, int* py) { int tmp = 0; tmp = *px; *px = *py; *py = tmp; } int main() { int num1 = 1; int num2 = 2; Swap2(&num1, &num2); printf("Swap2::num1 = %d num2 = %d\n", num1, num2); return 0; }
对代码进行一下分析:
这次我们再来看看结果:
所以,传址调用可以让实参和形参建立起真正的联系。
以上就是对函数调用的两种方式,传值调用和传址调用的介绍,欢迎大家指正,我们一起进步!!!