总结性的谈一谈函数传参的知识。(c/c++初学的一定要看)

来源:互联网 发布:炒股软件什么好 编辑:程序博客网 时间:2024/05/16 06:43
总结性的谈一谈函数传参的知识。(c/c++初学的一定要看)

    函数是最长用到的知识。试想一下,如果没有函数,你的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

    函数是最长用到的知识。试想一下,如果没有函数,你的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。
原创粉丝点击