C语言中实参与形参的传递
先写一个简单的数字交换代码
乍一看好像没有什么错误,首先定义了一个数字交换的函数,然后把a,b(实参)传递给x,y(形参),在函数swap中完成对a,b的调换,然后输出a,b。但结果真的对吗?我们来看看输出的结果。
为什么明明看起来一切正常却没有按照我们想的那样去完成数字的交换呢?因为实参在传递数值给形参的时候,形参只不过是实参的一个临时拷贝,形参的改变并不会改变实参的实际变量。形参一旦在函数体内完成自己的”任务“,就会自动销毁,释放空间。()并不会返回实际的值回到a,b中,总而言之,实参可以给形参传值,而形参不能给实参传值,这是一个单向的过程。但是我如果想要在函数体内改变实参a,b,那该怎么办呢?很简单,把实参a,b的地址传给函数,如下:
这样就把数字转过来了,为什么上面的方法不行,而下面的就可以呢?
因为在实参给形参传递的过程中,形参只是实参的一个临时拷贝,一个临时地址,用完自动销毁,如图,可以明显的看出实参a,b和形参x,y的地址明显不同。
第一种方法只是把实参a,b的值传递给形参x,y, 所以形参x,y完成”使命“后销毁自己的临时地址,根本不会影响到实参a,b。而第二种方法则是直接把实参a,b的地址传给形参p1,p2,地址相同,所以p1,p2在改变的同时,a,b也在改变,因为它们的地址是相同的。
这就是二者的传递关系了,多多练习就能熟练的掌握了。