| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 891 人关注过本帖
标题:《新手篇》向函数传递实参的两种方法
只看楼主 加入收藏
小旭哥
Rank: 2
等 级:论坛游民
帖 子:106
专家分:72
注 册:2012-11-4
结帖率:86.21%
收藏
 问题点数:0 回复次数:15 
《新手篇》向函数传递实参的两种方法
    当你学到指针的时候,估计你们老师经常会介绍到这么一个概念:“向函数传递实参的方法有两种,按值传递和按引用传递”。 我是自学编程的,谈谈个人理解。。。  
 
    按值传递,就是当你向一个函数传递实参的时候(弄懂什么是形参和什么是实参),其实程序就是创建了一个副本(被你传递的数据的副本)。那么怎么理解副本呢,形象的说,比如当你创建一个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声明。在此不多说明,关键是理解按引用传递和按值传递。
    希望我上面所说的能对初学者有点帮助,当初我也是别人慢慢教我的,我才能学这么多,今天我也希望我能帮到一些人。由于才疏学浅,上面可能有理解错误或是口语错误,欢迎各位人士指点,以促进我的进步。不胜感激。
    知识是全人类的,很高兴每天能把一些自己的所学和大家交流。
搜索更多相关主题的帖子: 影响 
2012-11-06 23:14
newdos
Rank: 9Rank: 9Rank: 9
等 级:禁止访问
威 望:6
帖 子:251
专家分:1169
注 册:2012-8-13
收藏
得分:0 
无分帖,无人关注。
2012-11-07 11:04
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
感谢楼主分享,看后收益良多
同时产生个疑问,那就是指针本身有没有地址呢?如果没那么他在内存中是怎么存在的,如果有那么楼主刚才说的两个指针p和q,如果不是“p=q”而是将p的地址付给q,那么p改变之后会是什么结果呢??
本人新手,说错勿怪

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-11-07 15:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
指针实际上就是普通的变量,只不过程序将它的值解释为地址,而且依据该变量的声明,假定从这个地址开始的一块内存是储存某种数据类型的。

授人以渔,不授人以鱼。
2012-11-07 16:38
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
变量有类型之分,而变量的类型又决定系统为他分配的空间,如整型变量分配4个或2个字节,字符型2个,双精度的8个,那么指针又分配几个字节呢?是服从于指针的类型还是分配固定空间,

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-11-07 19:18
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
指针永远是机器字长的大小,32位机上是32位,64位机上是64位,同理,16位机上是16位,无论它指向什么类型,都是这个尺寸,即自身占这么多空间。不要以为使用指针就不占内存,除了它所指向的对象所占的内存,每使用多一个指针就多占一份指针的内存。

授人以渔,不授人以鱼。
2012-11-07 19:27
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
回复 6楼 TonyDeng
膜拜

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-11-07 19:42
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
其实,把指针想像为诸葛亮的锦囊,或者是一张名片,就知道那是什么概念了。

授人以渔,不授人以鱼。
2012-11-07 19:46
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
所谓指针传参,是指传给函数的实参是一个指针,但函数获得的形参仍然是通过值复制实参指针的值而新建的,跟普通的值参数传递一样,都是值传递,只不过这次传递的是地址,而人家直接传内容。传参数,也一样有复制动作,只是只需要复制一个指针那么大的数据就可以了。

指针传参,一般用在对象不好直接复制的情形下,比如结构或类对象,这些数据内部往往包含很多别的东西,尺寸也比较大,直接复制不方便,就不妨复制它的地址,让对方自己去寻访,在这方面说是灵活了,但正如1楼所说,这样把真身暴露在外,也容易被篡改或破坏,有利必有弊,如何使用,自己权衡。32位机上的指针,尺寸已经是32位,如果对基本的数据类型使用指针,其实是没什么益处的,最大的基本数据类型double也不过是64位,就算提供128位的基本数据类型,也要复制一份32位的数据,跟复制64位或128位差不了多少,多使用了内存和周折不说,还容易产生失误。

只要抓住指针的本质,如何使用它,其实是不难理解的。很多初学者,只是没有建立起正确的指针模型罢了。

授人以渔,不授人以鱼。
2012-11-07 19:58
yaobao
Rank: 13Rank: 13Rank: 13Rank: 13
等 级:蒙面侠
威 望:4
帖 子:1854
专家分:4121
注 册:2012-10-25
收藏
得分:0 
把指针比喻成名片,呵呵,很很形象,但这个名片也忒大了一点竟然和普通int型数据一样大,是char的两个大,但是指向数组之类的就很方便了,哈哈。。。

认认真真的学习,踏踏实实的走路:戒骄戒躁!!!
2012-11-07 20:52
快速回复:《新手篇》向函数传递实参的两种方法
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.023635 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved