在C语言中关于形参和实参的传递分为两种:值传递和地址传递。地址传递又分为:参数为指针变量,参数为引用类型,参数为数组名。我们可以这样想实参的传递过程:将主函数中所有参数(包括要调用的实参)作为地面上的实际数值占用内存,将要调用的实参复制一份并修改为形参名字飘到空中形成形参。这样来分析形参和实参的数值改变问题就很简单了。

例题:

打开网易新闻 查看精彩图片

在此题中,地面上的所有参数为a,b,p1,p2,要调用的实参为指针变量p1,p2,将其复制一份修改其名字为m,n飘到空中形成形参,调用函数中只对形参m,n有作用,不影响地面上的参数,所以a,b,p1,p2的值都不变,输入5 3输出为5.0000 3.0000 5.0000 3.0000。但是在下面的例题中:

打开网易新闻 查看精彩图片

同理将地面参数和空中参数表示好,此时,*m表示的是辐射到地面上的参数a,所以*m的改变会引起原参数a的改变,同理b会改变。因为a和b的互换实质是内存空间的交换,所以p1和p2应该是一个整体,即p1还是指向a的,p2还是指向b的。所以p1和p2也互换。

结论:在参数传递过程中,当按地址传递参数时,形参的变化可能会引起实参的变化。

推论:

打开网易新闻 查看精彩图片

将参数全部传递,同理,此时地面参数为a,b,p1,p2,空中的参数为m,n,q,p,按道理说a,b应该不交换了,但是结果还是交换了。这是因为没有规定天空中m和q,n和p的关系,加上m=&q,n=&p后a,b就不交换了。

打开网易新闻 查看精彩图片