函数的本质
1、C语言为什么会有函数
(1)整个程序分成多个源文件,一个文件分成多个函数,一个函数分成多个语句,这就是整个程序的组织形式。这样组织的
好处在于:分化问题、便于编写程序、便于分工。
(2)函数的出现是人(程序员和架构师)的需要,而不是机器(编译器、CPU的需要)。
2、函数书写的一般规则:
第一:遵循一定格式。函数的返回类型、函数名、参数列表等。
第二:一个函数只做一件事。函数不能太长也不宜太短,原则就是一个函数只做一件事情。
第三:传参不易过多。在ARM体系下,传参不易超过4个。如果传参确实需要多,则考虑结构体打包。
第四:尽量少碰全局变量。函数最好用传参返回值和外部交换数据,不要用全局变量。
3、函数是动词、变量是名词(面向对象中分别叫方法和成员变量)
(1)函数将来被编译成可执行代码段,变量(全局变量)经过编译后变成数据或者在运行时变成数据。一个程序的运行需要代码和数据
两方向的结合才能完成。
(2)代码和数据需要彼此配合,代码是为了加工数据,数据必须借助代码来起作用。
4、函数的实质是:数据处理器
(1)程序的主体是数据,也就是说程序运行的主要目标是生成目标数据,我们写代码也是为了目标数据。我们如何得到目标数据:
必须两个因素:程序的输入数据+程序。
(2)函数就是程序的一个缩影,函数的参数列表其实就是为了给函数输入原材料数据,函数的返回值和输出型参数就是为了向外部输出目标数据,
函数的函数体里的那些代码就是加工算法。
(3)函数在静止没有执行的时候,此时只占一些存储空间但是不占用资源(CPU+内存);函数的每一次运行就好像机器的每一次开机运行,运行时
需要耗费资源 (CPU+内存),运行时可以对数据加工生成目标数据,函数运行完毕后释放占用的资源。
(4)整个程序的运行其实就是很多个函数相继运行的连续过程。
5、函数的三要素:定义、声明、调用
(1)函数的定义就是函数体、函数声明是函数原型、函数调用就是使用函数
(2)函数定义是函数的根本,函数定义中的函数名表示了这个函数在内存中的首地址,所以可以用函数名来调用执行这个函数(实质是指针解引用访问);
函数定义中的函数体是函数的执行关键,函数将来执行时主要就是执行函数体。所以一个函数没有定义就是无基之塔。
6、函数原型和作用
(1)函数原型就是函数的声明,说白了就是函数的函数名、返回值类型、参数列表。
(2)函数原型的主要作用就是给编译器提供原型,让编译器在编译程序时帮我们进行参数的静态类型检查。
(3)编译器从源文件的第一行开始编译,遇到函数声明时就会收到编译器的函数声明表中,然后继续向后。当遇到一个函数调用时,就在我的本文件的函数声明
表中去查这个函数,看有没有原型相对应的一个函数(这个相对应的函数有且只能有一个)。如果没有或者只有一部分匹配则会报错或者是报警告;如果发现多个
也会报错或者报警告(函数重复了,C语言中不允许2个函数原型完全一样,这个过程其实是在编译器遇到函数定义时完成的。所以函数可以重复声明,但是不能重复定义)。
|