认识MySQL数据库
下载MySQL软件
安装MySQL软件
在Linux系统环境下的安装MySQL
测试安装环境
合理配置环境变量
卸载MySQL数据库
函数的概念
函数的分类
函数定义的一般形式
一个C语言源程序一般是由一个或多个文件组成,一个源程序文件是一个编译单位,而一个源文件又可以由若干个函数构成,也就是说,函数是C语言程序基本的组成单位。每个程序有且只能有一个main()函数,其他的函数都是子函数。
C语言程序总是从main()函数开始执行,完成对其他函数的调用后再返回到main()函数,最后由main()函数结束整个程序。
在C语言中可从不同的角度对函数分类。
(1) 从函数定义的角度看,函数可分为库函数和用户定义函数两种。
库函数:由C系统提供,用户无须定义,也不必在程序中作类型说明,只需在程序前包含有该函数原型的头文件即可在程序中直接调用。
用户定义函数:由用户按需要写的函数。对于用户自定义函数,不仅要在程序中定义函数本身,而且在主调函数模块中还必须对该被调函数进行类型说明,然后才能使用。
(2) 从函数是否有返回值的角度看,又可以把函数分为有返回值函数和无返回值函数两种。
(3) 从是否需要参数的角度看又可以把函数分为无参函数和有参函数两种。
函数作为C程序的基本组成部分来说,是具有相对独立性的程序模块,能够供其他程序调用,并在执行完自己的功能后,返回调用它的程序中。函数的定义实际上就是描述一个函数所完成功能的具体过程。
由于有些函数需要参数而有些函数不需要参数,所以函数的定义也有两种形式。
1. 无参函数的定义形式
2. 有参函数定义的一般形式
函数的类型
函数的返回值
函数调用的方式
对被调用函数的声明和函数原型
在定义函数时,必须指明函数的返回值类型,而且return语句中表达式的类型应该与函数定义时首部的函数类型是一致的,如果二者不一致,则以函数定义时函数首部的函数类型为准。
如果一个函数不需要返回值,则将该函数指定为void类型,此时函数体内不必使用return语句,在调用该函数时,执行到函数末尾就会自动返回主调函数中。
一个函数中可以有一个以上的return语句,但不论执行到哪个return,都将结束函数的调用返回主调函数,即带返回值的函数只能返回一个值。
当函数被调用时,就会执行函数体内的语句,完成具体的操作,如果希望将这些操作的结果返回给主函数,那么就需要使用函数的返回值。
函数的返回值是通过函数中的return语句实现的。return语句将被调用函数中的一个确定值带回主调函数中去。
在C语言中,程序是通过对函数的调用来执行函数体的,函数调用的一般形式为: 函数名([实际参数表])
其中,[]中的内容可以省略,说明是对无参函数的调用。实际参数表中的参数可以是常数、变量或其他构造类型数据及表达式,各实参之间用逗号分隔。
函数调用时的说明:
(1) 调用函数时,函数名称必须与具有该功能的自定义函数名称完全一致。
(2) 实参在类型上必须按顺序与形参一一对应和匹配。如果类型不匹配,C编译程序将按赋值兼容的规则进行转换。如果实参和形参的类型不赋值兼容,通常并不给出出错信息,且程序仍然继续执行,只是得不到正确的结果。
(3) 如果实参表中包括多个参数,对实参的求值顺序随系统而异。有的系统按自左向右顺序求实参的值,有的系统则相反。
在主函数中调用某函数之前,应该对被调函数进行声明,这与使用变量之前要先进行变量声明是一样的。在主函数中对被调函数进行声明的目的是告知编译系统被调函数返回值的类型,以便在主函数中按照该类型对返回值进行相应的处理。
但是在以下三种情况下,可以省去对被调用函数的说明。
(1) 当被调用的函数出现在调用函数之前时。因为在调用之前,编译系统已经知道了被调用函数的函数类型、参数个数、类型和顺序。所以,在主调函数中可以不对被调函数再进行说明而直接调用。
(2) 如果在所有函数定义之前,在函数外部(如文件开始处)预先对各个函数进行了说明,则在调用函数中可缺省对被调用函数的说明。
(3) 对库函数的调用不需要再进行说明,但必须把该函数的头文件用#include命令包含在源文件前部。
在C语言中,函数之间的关系是平行的,是独立的,也就是在函数定义时不能嵌套定义,即一个函数定义的函数体内不能包含另外一个函数的完整定义。但是,C语言允许在一个函数的定义中出现对另一个函数的调用。这样就出现了函数的嵌套调用,也就是说,在调用一个函数的过程中可以调用另外一个函数。
如果在调用一个函数的过程中,又直接或间接地调用了该函数本身,这种形式称为函数的递归调用,而这个函数就称为递归函数。递归函数分为直接递归和间接递归两种。C语言的特点之一就在于允许函数的递归调用。在递归调用中,主调函数又是被调函数。执行递归函数将反复调用其自身,每调用一次就进入新的一层。
直接递归就是函数在处理过程中又直接调用了自己。
函数参数的传递
数组元素作为函数参数
数组名作为函数参数
函数的参数有两类:形式参数(简称形参)和实际参数(简称实参)。函数定义时的参数称为形参,形参在函数未被调用时是没有确定值的,只是形式上的参数。函数调用时使用的参数称为实参。
数组可以作为函数的参数使用,进行数据传送。数组用作函数参数有两种形式,一种是把数组元素(下标变量)作为实参使用;另一种是把数组名作为函数的形参和实参使用。
数组元素就是下标变量,它与普通变量并无区别。因此它作为函数实参使用与普通变量是完全相同的,在发生函数调用时,把作为实参的数组元素的值传送给形参,实现单向的值传送
用数组名作函数参数时,则要求形参和相对应的实参都必须是类型相同的数组,都必须有明确的数组说明。当形参和实参二者不一致时,即会发生错误。
在用数组名作函数参数时,不是进行值的传送,即不是把实参数组的每一个元素的值都赋予形参数组的各个元素。因为实际上形参数组并不存在,编译系统不为形参数组分配内存。那么,数据的传送是如何实现的呢?数组名就是数组的首地址。因此在数组名作函数参数时所进行的传送只是地址的传送,也就是说把实参数组的首地址赋予形参数组名。形参数组名取得该首地址之后,也就等于有了实在的数组。实际上是形参数组和实参数组为同一数组,共同拥有一段内存空间。
内部函数
外部函数
如果在一个源文件中定义的函数只能被本文件中的函数调用,而不能被同一源程序其他文件中的函数调用,这种函数称为内部函数。在定义内部函数时需要在函数名和函数类型前面加static关键字。
内部函数定义的一般形式如下:
static 类型说明符 函数名([形参表])
{
函数体
}
如果在一个源文件中定义的函数可以被同一源程序其他文件中的其他函数调用,这种函数称为外部函数。外部函数在整个源程序中都有效,在定义外部函数时需要在函数名和函数类型前面加关键字extern。
外部函数定义的一般形式为:
extern 类型说明符 函数名()
{
函数体
}
局部变量
全局变量
局部变量也称为内部变量。局部变量是在函数内作定义说明的。其作用域仅限于函数内,离开该函数后再使用这种变量是非法的。
关于局部变量的作用域还要说明以下几点:
(1) 主函数中定义的变量也只能在主函数中使用,不能在其他函数中使用。同时,主函数中也不能使用其他函数中定义的变量。因为主函数也是一个函数,它与其他函数是平行关系。这一点是与其他语言不同的,应予以注意。
(2) 形参变量是属于被调函数的局部变量,实参变量是属于主调函数的局部变量。
(3) 允许在不同的函数中使用相同的变量名,它们代表不同的对象,分配不同的单元,互不干扰,也不会发生混淆。如在前例中,形参和实参的变量名都为n,是完全允许的。
(4) 在复合语句中也可定义变量,其作用域只在复合语句范围内。
所谓全局变量,是指在函数外部定义的变量,是相对于局部变量而言的。全局变量又称外部变量。全局变量不属于哪一个函数,它属于一个源程序文件。其作用域是整个源程序,也就是说它的有效范围是从该变量定义的位置处开始直到源文件的结尾。
尽管全局变量能够方便多函数之间的信息传递,但是仍然建议在非必要时尽量不要使用全局变量。原因有以下几点:
(1) 外部变量破坏了函数的独立性,函数不再以独立的形式来完成各自的功能,因为这些功能的实现将受制于外部因素。这与结构化程序设计的思想是相违背的。
(2) 全局变量在程序执行的过程中始终占用存储单元,而不像局部变量那样仅在使用时才被分配存储单元,外部变量的释放必须等到整个程序完结,这也是一个不太经济的做法,因此在不必要时尽量不要使用全局变量。
(3) 使用全局变量过多,会降低程序的清晰性,人们往往难以清楚地判断出每个瞬时各个外部变量的值。在各个函数执行时,都可能改变外部变量的值,程序容易出错。因此,要限制使用全局变量,而多使用局部变量。