C 语言中函数的参数传入类型
每个函数如果独立的存在是没有意义的。所以函数之间必然是相互通信的。而最常见也最常用的函数通信的方式就是函数的参数与返回值。而函数的参数是更为重要一些。因为纯粹没有参数传入的函数是很好的。因为要实现某种功能,处理某些数据,就要从外界获得数据。
1. 值传入
值传入是在函数调用过程中,将原函数的数值复制一份后,将副本再传入调用的函数中。在函数中操作的都是副本的数值。对原有函数中的原变量是没有影响的。
2. 引用传入
引用传入是在函数调用的过程中,将原有函数中的变量直接传入被调用的函数中。这时在被调用函数中操作的变量是调用函数的原有变量。这时原有变量中的数值会跟着函数的调用中的操作而改变数值。
而引用传入有两种方式:
- 使用数组
- 使用 & 符号
2.1 使用数组
对于 C 语言来说,由于考虑到效率的问题的。数组的传递一般都是不复制的。因此函数中如果传入的是数组,那么在被调用的函数中其实就是传入了原始函数中的数组,而不是一个副本。
2.1 使用指针
使用指针是为了告诉 C 语言,我们这时希望将原有的变量直接传入被调用的函数,而不是一个副本。这种传入方式在其它的编译类型的编程语言中也有类似的传递方式。
3. 示例
3.1 值传入示例
#include <stdio.h>
int add(int x)
{
x++;
printf("sub function\n x: %d\n", x);
return 0;
}
int main()
{
int a = 1;
add(a);
printf("mian function\n a: %d\n", a);
return 0;
}
运行结果:
sub function
x: 2
mian function
a: 1
这段程序中,我们在主程序中声明并赋值了一个变量 a, 接着,我们调用了一个函数。在这个函数中,我们对于传递进来的变量 x 进行了自加操作。然后向屏幕打印此时的变量值。在这个被调用的函数执行完毕后,我们返回到了主函数中。然后再次输出此时的变量数值。发现是没有变化的。
3.2 引用传入示例
使用数组示例
#include <stdio.h>
int add(int x[])
{
x[0]++;
printf("sub function\n x: %d\n", x[0]);
return 0;
}
int main()
{
int a[] = {1};
add(a);
printf("mian function\n a: %d\n", a[0]);
return 0;
}
运行结果:
sub function
x: 2
mian function
a: 2
这个示例程序中,我们采用了数组传值的方式。其实这里只使用了一个只有一个数值的数组。其实和使用一个整数作为变量的效果是一样的。我们首先初始化了一个数组,里面有一个数值 1 ,然后我们通过数组传值到另外一个函数中。此时我们对这个数组中的数值进行自加操作,然后显式此时的数值。在这些操作结束后。程序返回到主函数中。然后显式此时主函数中的数值。发现已经同步发生了变化。
使用指针
#include <stdio.h>
int add(int *x)
{
(*x)++;
printf("sub function\n x: %d\n", *x);
return 0;
}
int main()
{
int a = 1;
add(&a);
printf("mian function\n a: %d\n", a);
return 0;
}
运行结果:
sub function
x: 2
mian function
a: 2
在这个示例程序中,我们使用了指针进行传值,这样的话,被调用的函数传递进去的和调用它的函数中的值是同一个值。这就是我们在被调用函数中进行了自加操作后。原来函数的值也发生了变化。这个示例可以和之前的值传递的示例对照看。这两个示例的步骤完全一致,只是传值的方式不同,所以造成了不同的结果。
4. 小结
对于函数的参数的值的传递问题,是程序中最容易出问题的地方。有些时候我们希望在被调用程序中的数值变化可以直接影响到调用这个程序的程序的数值的变化,有时候我们反而不希望被调用的函数中的修改影响到原有程序中的数值。
所以我们在数传递的过程中会有两种形式,一种是变量的副本的传递,另外一种就是直接将值本身直接传递进去。通过副本的传递,在被调用程序中的任何修改只是局限在被调用程序中。那么其本身不会受到影响。而直接传递本身进入函数中的传递,则会同步修改两边的变量数值。