C语言之函数.ppt
Version 3.0函数函数第九章第九章回顾回顾指针变量指针变量指针运算符指针运算符指针与数组指针与数组内存分配内存分配2 2目标目标掌握函数的结构掌握函数的结构掌握函数声明和原型掌握函数声明和原型按值传递按值传递/按地址传递按地址传递理解函数的作用域理解函数的作用域掌握函数指针掌握函数指针3 3函数函数独立的程序段独立的程序段执行一个具体的、明确定义的任务执行一个具体的、明确定义的任务易于编写、理解、调试和维护易于编写、理解、调试和维护将需要多次执行的一组指令定义为函数将需要多次执行的一组指令定义为函数4 4函数的结构函数的结构type_specifier function_name(arguments)函数体函数体返回值的数据类型返回值的数据类型有效的函数名有效的函数名形式参数形式参数5 5函数的参数函数的参数#include int squarer(int x);main()int i;for(i=1;i=10;i+)printf(nSquare of%d is%d,i,squarer(i);int squarer(int x)/*int x;*/int j;j=x*x;return(j);形式参数形式参数实际参数实际参数6 6从函数返回从函数返回int squarer(int x)/*int x;*/int j;j=x*x;return(j);将控制权从函数传回主调程序将控制权从函数传回主调程序把把 return 语句中的内容返回给主调程序语句中的内容返回给主调程序7 7函数的数据类型函数的数据类型如果返回的是一个整型值或者没有返回值,如果返回的是一个整型值或者没有返回值,可以省略类型标识符可以省略类型标识符为了避免出现不一致,最好指定数据类型为了避免出现不一致,最好指定数据类型int squarer(int x)/*int x;*/int j;j=x*x;return(j);8 8调用函数调用函数函数名后面必须有括号函数名后面必须有括号一个函数只能返回一个值一个函数只能返回一个值程序可以有一个以上的函数程序可以有一个以上的函数主调函数主调函数被调函数被调函数9 9函数声明函数声明在定义之前使用函数,必须声明在定义之前使用函数,必须声明否则,一些编译器会返回错误否则,一些编译器会返回错误#include main()address();address()“隐式隐式”声明声明1010函数原型函数原型指定参数的数据类型指定参数的数据类型如果调用时所使用的参数与原型的参数之如果调用时所使用的参数与原型的参数之间不一致,系统将报错间不一致,系统将报错char abc(int x,int y);abc(12);1111变量变量局部变量局部变量在函数内部声明进入一个程序块时创建,退出该程序块时销毁形式参数形式参数在函数定义中被声明为参数在函数内部像局部变量一样使用全局变量全局变量在所有函数以外声明在程序的整个执行期间都拥有值1212存储类别存储类别 2-1存储类别是变量的属性存储类别是变量的属性存储类别定义了:存储类别定义了:生命周期保留特定值的时间长度可见性程序的哪些部分将能够“看见”该变量1313存储类别存储类别 2-2自动的自动的(auto)外部的外部的(extern)静态的静态的(static)寄存器的寄存器的(register)1414函数作用域规则函数作用域规则一块代码是否有权访问另一块代码或数据一块代码是否有权访问另一块代码或数据函数内部的代码对该函数来说是私有或局部的函数内部的代码对该函数来说是私有或局部的两个函数拥有不同的作用域两个函数拥有不同的作用域但处于相同的级别但处于相同的级别函数不能在其他函数以内定义函数不能在其他函数以内定义1515调用函数调用函数按值传递按值传递按地址传递按地址传递25100#25100#251001616按按值值传递传递变变量的量的值值被被传递给传递给被被调调函数,并且函数,并且对这对这个个值值的任何改的任何改变变都不会影响被都不会影响被传变传变量的原始量的原始值值默认情况下,函数参数都是按值传递的默认情况下,函数参数都是按值传递的参数值是通过临时变量传递的参数值是通过临时变量传递的所有操作都针对这些临时变量所有操作都针对这些临时变量1717按地址传递按地址传递允许函数访问内存位置允许函数访问内存位置被调函数能够修改主调程序的参数的值被调函数能够修改主调程序的参数的值定义定义getstr(char*ptr_str,int*ptr_int);使用使用getstr(pstr,&var);1818函数调用的嵌套函数调用的嵌套main().palindrome();.palindrome().getstr();reverse();cmp();.1919多文件程序中的函数多文件程序中的函数函数可以定义成静态的或者外部的函数可以定义成静态的或者外部的静态函数只能在其程序文件内部被识别静态函数只能在其程序文件内部被识别static fn _type fn_name(argument list);外部函数可以被程序的所有文件识别外部函数可以被程序的所有文件识别extern fn_type fn_name(argument list);2020函数指针函数指针函数在内存中的物理位置函数的入口点函数在内存中的物理位置函数的入口点void check(char*a,char*b,int(*cmp)()printf(testing for equality n);if(!(*cmp)(a,b)printf(Equal);else printf(Not Equal);#include#include void check(char*a,char*b,int(*cmp)();main()char s180;char s280;int(*p)();p=strcmp;gets(s1);gets(s2);check(s1,s2,p);2121总结总结函数的结构函数的结构函数声明和函数原型函数声明和函数原型按值传递按值传递/按地址传递按地址传递函数的作用域规则函数的作用域规则多文件程序中的函数多文件程序中的函数函数指针函数指针2222