总结性的谈一谈函数传参的知识。(c/c 初学的一…

2008-02-23 05:33:35来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

声明一下,本人但是菜鸟一个,有什么理解上的错误,希望大家能指出。
函数是最长用到的知识。试想一下,假如没有函数,您的main函数可能长的连您自己都觉得不好意思。既然每个人都会经常使用函数,我们有必要好好的理解函数的知识。
函数主要的知识点就是函数的声明,定义,调用。
今天主要讲函数的定义和调用。先简要的说一下声明。当调用函数在定义函数之前就应当声明一下告诉系统函数讲在后边定义。当在多文档时也应在其他文档外调用本文档函数时在调用前声明。声明其实就是简单的把定义函数的首部(返回类型,函数名,形参类型)写出来,以;结束。形参名可写可不写。但有特别情况。我后边再说!
函数的定义大家最容易乱的就是行参和的类型和函数的返回值。
我总结了一下可分为几种。

1:以实参的副本形式。
这种方式最容易理解,就是很多教程上所说的值传递。把实参的值复制给形参创建的局部对象。函数对形参做的改变不会影响到实参,因为他们是不同的对象。在讨论一下这种情况下的const。因为形参和实参是不同的对象,唯一的联系只是调用时的值传递,所以形参和实参的const修饰没有限制。常量也能够做为实参调用。但是声明为const的形参,只能引用,不能改变他的值。这大家应该是知道的。

2:以指针传送地址的形式。

这种方式最令C语言初学者头疼。因为是指针所以传递的是地址。也就是说实参向形参传递的是实参所指向对象的地址。既然这样,形参在函数中谢引用所改变的值,同时也改变了实参所指向对象的值,因为他们本身就是指象一个地址,即同一个对象。但因为函数调用所创建的局部形参指针,他也是实参指针的副本,所以当改变形参的指针值(即指向另一个对象)实参是没有随之改变的。
讨论一下这种情况下的const。
当然传送的是地址就肯定不能是常量了。有很多中情况。假如假如实参是指向非const型的,形参能够是指向const型的也能够是非const型的。当实参是指向const型的,形参也应该是指向const的。因为当在函数中改变了形参指针所指向的内容就是改变了实参指向的内容,但这显然和形参是指向const型的相矛盾。当然我们知道c语言中函数名代表数组的首地址。所以实参同样能够传递数组名。当然也能够通过取地址符来做实参传递地址。指向const的指针同样只能引用,不能改变指向内容的值。

3:以引用形式,即和实参的对象相关联。
引用是c 中才能见到的知识点。引用大家都很清楚是个对象的别名,也就是说把引用名和一个对象相关联,他们是同一块内存空间的名字。既然这样。当形参定义成引用时很容易就能理解为什么函数中对引用的改变同时也是对实参的改变。
讨论一下这种情况的const
当形参是非const型的引用。实参不能是const型的对象。大家看完指针的部分应该就能理解这里。同样不能用常量值来做为实参。也不能用需要转换的类型的对象来做实参。只能用完全同类型的非const对象来做实参。但当形参为const型的引用时能够用非const对象做实参,也能够用常量来做。

还要补充几点:
1。传递指向指针的引用。
形参定义为int *&a
a是个指针。和实参的指针相关联。函数中改变了a的值,就是改变了实参指针的指向。

2。通过引用传递数组。平时我门都是传递数组的地址。形参作为指针来通过解操作符(*)引用数组元素。或是传递数组地址。形参同样是数组名来接收。
但是通过引用传递数组是传递实参数组本身。所以形参的大小也要匹配。如 int (&arr)[10]


从代码效率上来看。假如是以实参的副本形式传递。那过程效率是相对低一些。他要创建新的对象。来接受实参传来的值。用指针相对来说好一些。尤其在传递类类型时,毕竟函数调用时建立的临时指针。只占4字节。当为引用形式时效率就很高了,因为他就是实参本身。当传递类类型时,假如类类型sizeof()的值很大。用复制实参的形式虽然能够,但是效率太低,但假如用引用我认为是很好的办法,但前边说了,假如形参是非const型引用,实参是有需要的,所以假如不改变型参值的话一般定义为const




标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 关于C/C 的小知识点

下一篇: c, c 库调用相关知识

热门词条
热门标签