值传递
函数的形参如果是一个普通变量,实际参数到形式参数的数据传递过程就叫作值传递。值传递是将实际参数复制一份副本传递到函数中,在函数内部对参数进行修改,而不会影响到实际参数。
下面通过一个案例演示函数参数的值传递,具体如例1所示。
例1 value.c
1 #include <stdio.h>
2 void func(int a,int b ) //函数功能:交换两个整型数据
3 {
4 int temp;
5 temp = a;
6 a = b;
7 b = temp;
8 printf("a=%d b=%d\n", a, b); //输出交换之后的数据
9 }
10 int main()
11 {
12 int x = 10, y = 20; //定义实际参数
13 func(x, y); //调用func()函数
14 printf("x=%d y=%d\n", x, y); //输出main()函数的实际参数变量
15 return 0;
16 }
例1运行结果如图1所示。
图1 例1运行结果
在例1中,第2~9行代码定义了一个函数func(),该函数有两个参数a和b,在函数内部交换两个参数的值,并打印输出交换后的变量值。第12行代码在main()函数中定义了两个变量x和y,其值分别为10和20。第13行代码调用func()函数,并将变量x、y作为参数传递给func()。第14行代码打印变量x、y的值。由图1可知,func()函数中变量a、b的值交换成功,而main()函数中变量x、y的值并没有交换。
在值传递过程中,实际参数在栈中有独立的内存空间,形式参数变量在栈中也有独立的内存空间,将实际参数传递给形式参数,就是用实际参数的值初始化形式参数变量,在形式参数内存中改变这个数值,实际参数不会受到影响。例如,在例1中,调用func()函数时,编译器会在栈中为参数a、b分别分配一块内存空间,然后用变量x和y的值初始化变量a和b,在func()函数内部交换a、b的值,变量x、y的值并不受影响。形参变量a、b与实参变量x、y在内存中的状态如图2所示。
图2 形参变量a、b与实参变量x、y在内存中的状态