新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版用于讨论编程和软件设计的技巧
    [返回] 中文XML论坛 - 专业的XML技术讨论区计算机技术与应用『 编程心得 』 → 函数名的理解 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 8561 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 函数名的理解 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     Ph0nix 帅哥哟,离线,有人找我吗?魔羯座1985-1-20
      
      
      等级:大一新生
      文章:10
      积分:90
      门派:GOOGLEBBS.NET
      注册:2005/3/13

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Ph0nix发送一个短消息 把Ph0nix加入好友 查看Ph0nix的个人资料 搜索Ph0nix在『 编程心得 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看Ph0nix的博客楼主
    发贴心情 函数名的理解

    我们都知道,不论在什么编程设计语言里函数都是一个非常重要的概念。对与大多数初学者来说,函数名理解的不充分,会导致在后来的学习中,对诸如函数指针,函数的引用返回等概念的理解有困难。充分理解函数名的作用在程序设计中的作用也显得由为重要。
            在此之前,我先简要说一下程序在内存中的分配问题。在一个程序运行时,我们可以简单的吧内存分为四个部分:代码区(Code Area),全局数据区(Data Area),堆区(Heap Area),和栈区(Stack Area)。其中程序运行时对数据的处理放在代码区,定义的普通变量放在栈区,全局变量和静态变量(包括全局和局部)放在全局数据区,堆区用来存放动态数据(主要由new,malloc等函数定义)。
            有了这些基本知识,现在可以开始讲解了。其实说白了,函数名表示的就时一个地址,如果你很熟悉数组的话,就会很好理解,函数名可以看做同数组名一样,它起着一个标号的作用,既然是标号,就具有地址的属性。因此,我们在以后学习函数中遇到不理解的地方大可以与数组名的概念比较一下。但是它们之间还时有些不同的地方。如数组前的类型名如:int ,char等,实际上时告诉程序在对数组的存取中以多少个内存单元为单位一起处理。举个例子:在16位机上,以个整型变量占2个字节,程序在对这个变量进行操作时就两个两个字节的取值。而函数前的类型名表示函数的返回值,它的赋值实际上时由return语句决定的,注意这里我们用的时*赋值*,而不是什么传递,因为局部变量的生存时间在函数的“}”结束时就结束了,所返回的值实际上时临时开辟的内存空间(全局变量除外),因此我们不能把指针指向它,这样做是很危险的,因为临时数据的不知道什么时候就会被其他数据覆盖掉,如果后来对指针的操作破坏了栈区的一些重要数据,如其他调用函数的返回地址,就有可能造成程序的崩溃。
            关于函数指针,可以简单的表示为:int (* fun) (char a,char b,……);,如果我们用typedef语句对它进行定义的话,如:typedef int (*fun) (char a,char b,……);他表示一个指向返回值为int,有形如char a,char b参数的函数,我们可以用它来定义一个类型的指针,fun ptr1,ptr2;他们都有着与fun一样的属性,其实这很好理解,我们只要把函数之战看成简单的诸如:int之类的变量就行了,同样的我们也可以把它作为返回参数如我们已有这样的定义:typedef int(* FUN)();   那么返回函数指针的函数表达式就应该形如: FUN fun(int ,char);
    这时我们若把FUN与int类比一下就会很好理解了。我之所以总是强调类比,因为在程序学习中类比时个非常重要的学习方法,可以充分的举一反三,让你的学习变的非常轻松。
     还有个值得一说的就时return语句,我们经常用它让函数返回一个值,从而让调用函数取得最终的结果,可以说:return是被调用函数向调用函数之间传递函数的一个接口,当然你也可以用诸如引用,指针等方法达到传递多个值的结果。不带参数的return起着结束被调用程序,返回调用程序的作用,在这里它与exit很像,所不同的是,exit是返回操作系统。带返回值的return起着向函数名前的类型*赋值*的作用
    ,如果函数名前是比较普通的类型,系统就会建立一个临时空间,把返回的数据存储进去,然后结束被调用函数,释放内存。如果是引用的话,就有可能不产生临时空间,看下面的例子:
    #include<iostream.h>

    float temp;

    float fn1(float r)
    {
     temp=r*r*3.14;
     return temp;
    }

    float &fn2(float r)
    {
     temp=r*r*3.14;
     return temp;

    }

    void main()
    {
     float a=fn1(5.0);//1
     float &b=fn1(5.0);//2 warning
     float c=fn2(5.0);//3
     float &d=fn2(5.0);//4
     cout<<a<<endl
      <<b<<endl
      <<c<<endl
      <<d<<endl;
    }

    这里我用C++写了个程序,如上a,b,c,d四个变量的赋值方法各不相同,其中语句1,时正常的调用,从临时空间对a赋值,但b的赋值在编译时会给个警告,正如我上面说的2语句时对临时空间的一个引用,因为临时空间的值随时会被改变,这样就造成了b的值不时确定的。由于3返回的是temp的引用,直接从全局变量temp获得值,这样就避免了临时空间的产生,从而带来了执行效率的提高和空间利益。语句4把d也建立成了temp的引用了,同样也不产生临时变量,但当temp改变时,d也会随之改变,这样也增加了d值的不稳定性。可能有些新手已经被我讲的一头雾水了,其实只要抓住return是个赋值语句,就能很好的理解其中传递数据的机理了。
     要讲的也就这么多了,由于我也是个菜鸟,可能在说明中有不正确的地方,还请各位不吝指教。:-)


       收藏   分享  
    顶(0)
      




    ----------------------------------------------
    个性需要打造 ,牛逼需要证明!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/3/13 22:20:00
     
     awt 帅哥哟,离线,有人找我吗?
      
      
      等级:大一(高数修炼中)
      文章:21
      积分:194
      门派:XML.ORG.CN
      注册:2005/3/11

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给awt发送一个短消息 把awt加入好友 查看awt的个人资料 搜索awt在『 编程心得 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看awt的博客2
    发贴心情 
    其实数组名与指针,函数名与指针还是存在不小的差别的
    比如:指针在接受数组参数的时候,存在一个数组到指针的隐式类型转换,在这个
    过程中指针不能得到数组名中关于元素个数的信息。

    详见《C专家编程》

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/3/14 10:59:00
     
     Ph0nix 帅哥哟,离线,有人找我吗?魔羯座1985-1-20
      
      
      等级:大一新生
      文章:10
      积分:90
      门派:GOOGLEBBS.NET
      注册:2005/3/13

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给Ph0nix发送一个短消息 把Ph0nix加入好友 查看Ph0nix的个人资料 搜索Ph0nix在『 编程心得 』 的所有贴子 引用回复这个贴子 回复这个贴子 查看Ph0nix的博客3
    发贴心情 
    我意思是说,理解的时候可以不必关心细节,数组和函数当然不能完全一样。

    ----------------------------------------------
    个性需要打造 ,牛逼需要证明!

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2005/3/14 19:32:00
     
     GoogleAdSense魔羯座1985-1-20
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 编程心得 』 的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2025/9/4 23:29:41

    本主题贴数3,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    46.875ms