函数传参是什么意思_函数间传递数据的四种方式「建议收藏」

函数传参是什么意思_函数间传递数据的四种方式「建议收藏」最近又碰到了函数传参的问题,每次碰到都会让作者疑惑一段时间,这次干脆总结整理一下,顺便让自己更加透彻的了解传参的问题

最近又碰到了函数传参的问题,每次碰到都会让作者疑惑一段时间,这次干脆总结整理一下,顺便让自己更加透彻的了解传参的问题。咱们开始吧。

c语言中,函数调用时传送给形参表的实参必须与形参有三个一致:类型、个数、顺序,
函数传参有三种方式:值传递,地址传递,引用传递

下面我们首先来介绍值传递:

  • 值传递为最简单的一种,因为它是把实参的值传送给函数局部工作区相应的副本中,函数使用这个副本执行必要的功能。函数修改的是副本的值,实参的值不变。

我们来看代码:

#include<stdio.h>
void swap(int m, int n){ 
   
    int m;
    m = n;
    n = temp;
}
int main(){ 
   
    int a, b;
    a = 2;
    b = 3;
    swap(a, b);
    printf("a=%d,b=%d",a,b);
}

打印出结果
在这里插入图片描述
我们可以看到,a和b在进行交换之前,他们的值分别为2和3,而进行交换操作之后,它们的值仍为2和3,但是在函数swap内部我们可以看到m和n的值确实发生过了交换。
怎么解释这个问题呢,我们可以利用以下代码:

a = 2;
m = a;
m = m+3;
a = ?;	m = ?;

这时我们可以看出来,a赋值之后又将a的值赋给了m,这样无论m进行什么操作,都不会影响到a的值。
说到这里我们就可以理解上面的代码了
调用参数的时候,swap(a,b)代表把a和b作为参数传入,在函数swap接收的时候,它们会自动的将a和b的值copy一份给与自己的参数,也就是形参。
换成代码可以如下理解:

swap(a,b);
swap(int m = a,int n = b);

所以函数内部进行的所有操作都不会影响到外部。


那么如何才能使得调用函数后实参也发生转换呢?
说到这里,我们就可以引出第二种传参方式:地址传递。

  • 地址传递与值传递的不同在于,它把实参的存储地址传送给形参,使得形参指针和实参指针指向同一块地址。因此,被调用函数中对形参指针所指向的地址中内容的任何改变都会影响到实参。

上代码-.-

#include<stdio.h>
void swap(int *m, int *n){ 
   
    int temp;
    temp = *m;
    *m = *n;
    *n = temp;
    printf("m=%d,n=%d\n",m,n);
    printf("m=%d,n=%d\n",*m,*n);
}
int main(){ 
   
    int a, b;
    a = 2;
    b = 3;
    printf("交换前:a=%d,b=%d\n",&a,&b);
    swap(&a, &b);
    printf("交换后:a=%d,b=%d\n",a,b);
    printf("交换后:a=%d,b=%d\n",&a,&b);
}

结果如下:
在这里插入图片描述
如图所示,a和b的值确实发生了交换,原理是什么呢?为了便于大家更好的理解,我将交换前后ab的地址也一并打印了出来。
我们可以看到,执行swap函数时,m和n都拿到了a和b的地址。其实它们的操作和值传递是一样的,只不过不使用指针时,m和n会将a和b的值放到属于自己的地址中。使用指针后m和n也指向了a与b的地址,再进行交换,这样交换过后就不会局限于之在函数内部。

值得一提的是,如果你在函数中使用了指针变量来交换值,那么最终结果仍会是失败的。
如下:

#include<stdio.h>
void swap(int *m, int *n){ 
   
    int *temp;
    printf("m=%d,n=%d\n",m,n);
    printf("m=%d,n=%d\n",*m,*n);
    temp = m;
    m = n;
    n = temp;
    printf("m=%d,n=%d\n",m,n);
    printf("m=%d,n=%d\n",*m,*n);
}
int main(){ 
   
    int a, b;
    a = 2;
    b = 3;
    printf("交换前:a=%d,b=%d\n",a,b);
    printf("交换前:a=%d,b=%d\n",&a,&b);
    swap(&a, &b);
    printf("交换后:a=%d,b=%d\n",a,b);
    printf("交换后:a=%d,b=%d\n",&a,&b);
}

在这里插入图片描述
a与b没有交换成功。
怎么理解?
我又将m和n交换途中的地址进行打印,很明显,我把mn的地址互换了,但是并没有对两个地址对应的值进行操作。你交换成功了 ,但又没有完全成功(不是)。


所以接下来就可以隆重介绍我们的第三位选手:引用传递

  • 引用传递是以引用为参数,则既可以使得对形参的任何操作都能改变相应数据,又使函数调用方便。引用传递是在形参调用前加入引用运算符“&”。引用为实参的别名,和实参是同一个变量,则他们的值也相同,该引用改变则它的实参也改变。

它的代码就方便多了

#include<stdio.h>
void swap(int &m, int &n){ 
   
    int temp;
    temp = m;
    m = n;
    n = temp;
    printf("m=%d,n=%d\n",m,n);
    printf("m=%d,n=%d\n",&m,&n);
}
int main(){ 
   
    int a, b;
    a = 2;
    b = 3;
    printf("交换前:a=%d,b=%d\n",a,b);
    printf("交换前:a=%d,b=%d\n",&a,&b);
    swap(a, b);
    printf("交换后:a=%d,b=%d\n",a,b);
    printf("交换后:a=%d,b=%d\n",&a,&b);
}

在这里插入图片描述
轻松完成任务。

对比于三种传参方式来说,引用传参直接操作实参,比前两种都简单。

引用类型作形参,在内存中并没有产生实参的副本,它直接对实参操作;而一般变量作参数,形参与实参就占用不同的存储单元,所以形参变量的值是实参变量的副本。因此,当参数传递的数据量较大时,用引用比用一般变量传递参数的时间和空间效率都好。

指针参数虽然也能达到与使用引用的效果,但在被调函数中需要重复使用“*指针变量名”的形式进行运算,这很容易产生错误且程序的阅读性较差;另一方面,在主调函数的调用点处,必须用变量的地址作为实参。

那么,本次分享到这里就告一段落了,喜欢的朋友可以给个免费的赞,我们下次再见。

今天的文章函数传参是什么意思_函数间传递数据的四种方式「建议收藏」分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/75037.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注