《新手篇》向函数传递实参的两种方法
当你学到指针的时候,估计你们老师经常会介绍到这么一个概念:“向函数传递实参的方法有两种,按值传递和按引用传递”。 我是自学编程的,谈谈个人理解。。。 按值传递,就是当你向一个函数传递实参的时候(弄懂什么是形参和什么是实参),其实程序就是创建了一个副本(被你传递的数据的副本)。那么怎么理解副本呢,形象的说,比如当你创建一个word文档,然后你复制,粘贴到另一个文件夹里,此时便有两个word文档,当你将其中一个删除或是修改其中的数据,另外一个文档并不会受到影响。同理,当你采用按值传递的方式时,对副本的任何操作都不会影响到原来的数据。按值传递可以通过防止程序修改原数据,而提高代码的安全性。
按引用传递,其实,严格的来说,真正的按引用传递是不存在的,而是通过按值传递来模拟按引用传递。(希望初学者能够很好理解这句话,这句话不是我自己的理解,而是从一本很正规的书上看来的,我自己思考了下,觉得很有道理。)比如int *p = &a; 把a的地址传递给了p,再将p传递给函数,p存储的是a的地址。那么在函数中对*p的操作就是直接对原数据的操作。形象的来说,就好像word文档里的超链接功能,使得一个文件的变化会同步地影响到另一个文件,当然了,你也可以将它理解为间接地操作一个数据,只是对这个数据的操作不是放在该数据所在的函数里,而是在另外一个函数里。(不知道我表达地是否清楚)
对于按引用传递,还有个小地方得说一下。int *p, *q; int a, b; p = &a; q = p; 如果 *p = 2,则 *q = 2;此时p , q都是指向同一数,这很好理解。但是,当把p指向b之后,q依然指向a,千万不要认为q指向b(个人觉得这就和上面所说的模拟按引用传递扯上一点关系了)。希望初学者可以理解。
关于按引用传递和按值传递的其他说明。按值传递可以提到程序的安全性,但是程序性能降低了,因为它加大了系统的开销(要复制一个数据,并开辟存储区)。特别是当一个数据特别大的时候,影响特别明显。等学到结构体,会讲到这一点。而按引用传递,相反,安全性是降低了,因为你可能无意中改变了一个不需要改变其值的变量,但是却提高了程序的灵活性,性能上来了。特别是对于一个特别大的数据。当然有办法可以克服安全性问题,那就是你们很快会学到的const声明。在此不多说明,关键是理解按引用传递和按值传递。
希望我上面所说的能对初学者有点帮助,当初我也是别人慢慢教我的,我才能学这么多,今天我也希望我能帮到一些人。由于才疏学浅,上面可能有理解错误或是口语错误,欢迎各位人士指点,以促进我的进步。不胜感激。
知识是全人类的,很高兴每天能把一些自己的所学和大家交流。