1、函数的定义
(1)形式:函数=函数头+函数体
返回值类型 函数名(参数列表) //函数头 注意:参数可有可无
{
函数体(函数实现特定功能的过程);
}
注:当函数无任何内容时,被称为空函数
形式如下:
类型说明符 函数名()
{
}
目的:“占位”,只是现在还没有想好怎么编写,先利用它来占位,以后完成。
2、函数的声明
在程序编写过程中,要先对函数进行声明,再对函数进行定义。函数声明是让编译器知道函数的名称、参数、返回值类型等信息。而函数定义就是让编译器知道函数的功能。
形式如下:
返回值类型 函数名(参数列表);
注:如果将函数的定义放在调用函数之前,就不需要进行函数的声明,此时函数的定义已经包含了函数的声明。
3、返回语句
作用1:利用返回语句能立即从所在的函数中退出,即返回到调用的程序中去。
作用2:返回值,将函数值赋值给调用的表达式中;
注意:函数定义的返回值类型决定最终返回值的类型。
4、函数参数:传递数据给函数使用,函数利用接收到的数据进行具体的操作处理。
(1)形式参数:指形式上存在的参数。在定义函数时,函数后面括号中的变量名称为“形式参数”。在函数调用前,传递给函数的值将被复制到这些形式参数中;
(2)实际参数:实际存在的参数。在函数被调用时,函数后面括号中的参数为“实际参数”。函数的调用者提供给函数的参数叫做“实际参数” 。实际参数是表达式计算的结果,并且被复制给函数的形式参数。
(3)数组作函数参数:当数组作为函数的实参时,只传递数组的地址,而不是将整个数组赋值到函数中。当用数组名作实参调用时,指向该数组的第一个元素的指针被传递到函数中。
情况一:数组元素作为函数参数:此时与用变量作为函数实参一样,是单向传递。
情况二:数组名作为函数参数:例如,void Display(int iArray[10])注意:其中数组长度10是可以在函数声明和定义时省略的即 void Display(int iArray[])。
情况三:指针作为函数参数:因为数组名作实参时,传递的是数组第一个元素的指针。因此,可以这样声明:void Display(int* iArray);
(4)main函数的参数:
一般忽略不写main函数的参数,其实main的形式参数如下:
main(int argc,char* argv[])
其中,argc参数保存命令行的参数个数,一整型变量;而argv参数十一指向字符指针数组的指针,这个数组的每一个元素都指向命令行实参。每个命令行实参都是字符串。
5、函数的调用
其实函数调用的方式有3种如下:
(1)函数语句调用:例如,Display(); 这种情况下不要求函数带返回值;
(2)函数表达式调用:函数出现在一个表达式中,这时函数必须带回一个确定值。例如,sum=num*Add(3,5);
(3)函数参数调用:函数返回值作为实参传递到函数中使用;例如, res=Add(10,Add(3,5));
(4)C语言中,不允许嵌套定义,但允许嵌套调用··
6、内部函数和外部函数
源文件:函数是C语言程序中最小的单位,往往把一个函数或多个函数保存为一个文件,这个文件被称为“源文件”。
(1)内部函数:只希望该函数只被所在源文件使用。又一名称为“静态函数”
定义内部函数格式如下:
static 返回值类型 函数名(参数列表)
好处:不同的开发者可以分别编写不同的函数,而不必担心所使用的函数是否与其它源文件中的函数同名,因为内部函数只可以在所在的源文件中进行使用,所以即使不同的源文件中有相同的函数名也没有关系。、
(2)外部函数:可以被其他源文件调用的函数。
外部函数格式如下:
extern 返回值类型 函数名(参数列表)
其中,extern关键字是可以省略的,因为一般默认情况下,定义的函数是外部函数
7、局部变量和全局变量
(1)局部变量:函数内部定义的变量。另外,函数的形参也属于局部变量。
(2)全局变量:在所有函数的外部声明的变量。全局变量不属于某个函数,而属于整个源文件,但是如果外部文件要使用,则要用extern关键字进行引用修饰。