函数名的理解

我们都知道,不论在什么编程设计语言里函数都是一个非常重要的概念。对与大多数初学者来说,函数名理解的不充分,会导致在后来的学习中,对诸如函数指针,函数的引用返回等概念的理解有困难。充分理解函数名的作用在程序设计中的作用也显得由为重要。
        在此之前,我先简要说一下程序在内存中的分配问题。在一个程序运行时,我们可以简单的吧内存分为四个部分:代码区(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是个赋值语句,就能很好的理解其中传递数据的机理了。
 要讲的也就这么多了,由于我也是个菜鸟,可能在说明中有不正确的地方,还请各位不吝指教。:-)

原文连接:http://www.ieee.org.cn/dispbbs.asp?boardID=42&ID=15514

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值