一级棒(Eachfun)
一级棒 - 读书笔记 - C++ Primer - 形参与实参的相互关系
RSS订阅
形参与实参的相互关系
发表时间:2006-07-25 00:13:33 关键词:C++,MFC,VC,Primer,编程,教程,读书

  “形参的改变不影响实参”这句话说起来轻巧,但是要完全理解,似乎还有几个玄机。
  在我发表《函数的定义》一文后,有朋友发表意见,提到了“函数调用过程中的入栈与出栈”,在此首先作个说明:我读的是《C++ Primer》,而不是《编译原理》,入栈与出栈不归我讨论。在现在讨论的尺度内,我们可以这么认为:形参是函数内部的一个局部变量,该局部变量在函数开始执行时被初始化,而初始化它的值则来自实参的值。也就是说,它的定义与初始化类似于“int i=3;”。只是被分成两行写了,形参的定义写在函数的定义中,如:“int ttt(int b)”,初始化写在了调用中“cout << ttt(a) << endl;”。——参看上一篇文章《形参与实参概念》。
  那么,在函数中无论怎样改动b的值,被改的始终是形参这个局部变量,函数结束时,离开这个局部变量的作用域,变量被释放。
  但是,C语言的“指针传递”总是给人“形参能改变实参”的感觉,其实这是一个误解。对于指针传递来说,函数的形参是一个指针,传给它的实参也应该是指针(或者能转为指针的值,比如数组名、能转换为指针的类等)。在函数中,如果改变了该指针(对指针的改变就等同于让这个指针指向别处),不会影响主调函数中的实参。但是,由于指针对应着一个内存地址,通过它可以改变内存的内容。所以,无论在函数内部的形参还是外部的实参,它们都可以影响同一内存的值。所以,指针传递可以把函数内部的影响带到函数外,但是,带到函数外的绝不是形参,而是形参所指的内存。
  这就好比我把我家的钥匙给你配了一把,我手里的钥匙是实参,你手里的钥匙是形参。你无论是把钥匙折断还是磨短,都与我的钥匙无关,但是你用它开了我家的门却可以把我家洗劫一空。你影响的不是我的钥匙,而是我的财产。
  上文说到,C++有了“引用传递”后,“形参的改变不影响实参”被判无效。这就得提到“引用传递”的概念了,下文再续。

本站特约顾问律师常州东晟律师事务所朱立律师(电话13915029670,QQ646146109)提醒您:
本站文章皆为作者原创,其它媒体(包括但不限于报刊、杂志、网站、电视、电台)未经作者书面许可严禁转载(或部分摘录)!
相关评论
  • 简单地说,每次调用函数的时候,形参把实参克隆了一次,你再怎么折腾形参,也与实参无关.
    TNND就是一个入栈与出栈过程嘛,你可以去学学汇编.
    举例:
    mov cs1,100 //cs1=100;
    push cs1 //把cs1入栈;
    pop cs2 //把栈中的内容出栈给cs2;
    这与另一句话等价:
    mov cs1,100
    mov cs2,cs1
    为什么会使用上面的那种用法呢?
    因为push和pop占用更少的CPU周期.所以,一般调用函数都用入/出栈来备拷贝参数.
    作者:walkman 时间:2006-07-26 14:31:08
1
发表评论
称呼:
QQ:
邮箱:
链接:
内容:
搜索: 百度搜索 Google搜索
Copyright©2000 - 2008 Eachfun.Com, All Rights Reserved 一级棒网络
苏ICP备05080156号
一级棒建站系统 http://www.eachfun.com 一级棒版权所有,未经许可不得商用!