函数,在我们的数学课程学习中已经学习与使用过无数次了。比如y = f(x)=kx+b 这样的一次函数,我们输入变量x,通过函数f(x)的计算能得出y的值。在C语言里,函数的作用与其是一样的,只是各个部分的名称略有不同:C语言里将y的值称为“返回值”;将f()称为函数名,并且要自己来定义,只要不重复即可。将变量x称为“形参”;当然,非常重要的 kx+b,函数体内的语句是需要我们自己编写。
当不需要返回值时,我们使用void来替代,称为无返回值函数(部分编程语言里称为过程)
当不需要传入参数时,我们也使用void来替代,称无参数函数,只是机械的执行内部语句。
对于形参,我们可以传入值,也可以传入地址。前者对于传入的变量不会改变其值,而后者,可以修改传入的变量,即实参的值。
本章还讲了变量的作用域,有函数内部的作用域,本文件的作用域,整个程序的作用域。这个道理很简单,在函数内部声明的变量,其作用域就在本函数内部,而声明在函数外的变量而使用了static关键字进行限定,则只限于本文件内部,否则,即为全局变量。
注意:我们在编写程序的时候,多少也要有些行规,像I,j,k这类的变量,只用于函数内部的局部变量,且仅用于计数使用;而全局变量在定义时,其要以gXX开头,这样不仅方便自己阅读代码,也方便别人阅读,万一人家看出程序的bug呢!
注意:文章内也提到,全局变量与函数内的局部变量可以一致,实参与形参也可以一致。但大家在编程的时候,千万不要这样做,时间一久,自己都忘了。属于自己给自己埋雷了。
函数的声明里,文章写了,要在函数定义前进行声明,如果不声明,也是可以的,只要函数的定义在被调用之前即可。像IAR嵌入式开发环境下,可以通过选项强制必须有函数的声明。
关于头文件与C文件,我觉得两者的区别主要是内容的不同,是我们自行约定的。对于编译器来讲,它不管你是什么,它只认文本文件,但我们约定要将全局声明放在头文件内,以方便全局声明与调用,而函数实现,一定要放在C文件里。如果放在头文件里,其实也是可以的,只是在多文件调用时,编译器会产生多个实现的报错。(当然,只调用一次,则不会产生错误。)
关于查找,文章中提到的哨兵查找的实现挺棒的,只是在嵌入式编程里,像类似的查找基本都是const表,因此,无法在最后一位写入查找的值。如果我们的查找方式是在内存里,这个查找算法在随机数排序方式下还是不错的。
函数的应用非常有学问,像文章提到的“通用性”,这个就需要编程者要有较高的抽象能力与强大的数学总结归纳能力,善于发现内部相通的地方。总之,学习是循序渐进,切不可急于求成,让浮躁加身。