C语言的函数传参分为值传递和地址传递两种,这两种传参方式的区别在于,值传递方式不会改变实参的值,而地址传递会改变实参的值。
具体说来:
1.基本参数类型的形参都是值传递,函数体不能改变实参的值。
- void test1( int n){
- n = 100;
- }
- int a = 50;
- test1(a);
- printf("%d",a); //输出的值是50
复制代码 正如以上的程序输出结果一样,实参a的值并没有被函数test1改变,分析如下:
1>在main的栈区有一个内存空间存放变量a;
2>在test1的栈区有一个内存空间存放变量n;
3>调用函数test1(a)的时候,由于是指传递,a的值赋给了n,此时n=a=50.
4>函数执行,n=100,这个过程并没有改变a的值。
2.可以通过指针实现地址传递,在函数体内改变实参的值。- void test2 (int *n){
- *n=100;
- }
- int b = 50;
- test(&b);
- printf("%d",b); //输出结果是100
复制代码 地址传递可以实现一个 函数返回多个结果,在函数体内就可以改变函数外的实参的值。比如下边是一个没有返回值的函数,但是它却可以同时得到两个数的和与差:
- void test3(int n1,int n2,*sum,*dif) {
- *sum = n1 + n2;
- *dif = n1 - n2;
- }
- int a = 20;
- int b = 15;
- int sum;
- int dif;
- test3(a,b,&sum,&dif);
- printf("a与b的和是:%d\n",sum);
- printf("a与b的差是:%d\n",dif);
复制代码
|
|