C语言复习2----函数
C函数的特点 1)每个函数有唯一的函数名,程序调用这个函数就是转去执行此函数所包含的语句。 2)一个函数完成一个特定的任务。 3)函数的定义是独立的,封闭的,不受程序其它部分的干预,也不干预其它部分。函数不能嵌套定义。 4)函数能用函数名给调用程序返回一个值。 5)程序调用函数时可以用实参把数据传送给函数,但是不能用实参反向传回。
函数定义----无参函数和有参函数 无参函数定义的形式为: 类型标识符 函数名( ) { 说明部分 语句部分 } 有参函数定义的形式为: 类型标识符 函数名(形式参数列表及类型说明 )
double power(int x,int n) 函数类型标识符 函数类型标识符用void,表示不要函数返回值。 void main() 函数类型标识符没有void,表示要函数返回值。 函数类型标识符用double,表示返回数据的数据类型是双精度浮点。 double power(int x,int n)
函数的参数 函数定义中的参数列表说明函数参数的名称和类型,参数之间用逗号隔开。函数定义中的参数称为形参,主函数通过形参把数据传送给被调用函数。 参数列表为空就成为无参函数,只需写一对圆括号。 函数执行的最后一个return语句是返回,从被调用函数返回主调用函数,并将1个数值带回给主调用函数。
函数声明----先调用后定义 先调用后定义。如【例8-3】,在主函数中需要对自定义的函数声明,其作用是指出被调用函数的类型和参数类型,否则被调用函数被默认为是int类型。 被调用函数可在其它文件中定义,即先定义后调用。 先定义后调用。如果自定义函数的定义放在mian( )函数之前,则可以不需要声明。 如【例8-4】,power( )函数的定义在main( )函数之前,所以在main( )函数中不对power( )函数作任何声明,直接就使用power( )函数。
#include<stdio.h> void main() { int x,n; double num; double power(int,int); scanf("%d%d",&x,&n); num=power(x,n); printf("%lf\n",num);} double power(int x,int n) { int i; double p; p=1; for(i=1;i<=n;i++) p*=x; /* p=p*x */ return p;} 【例8-3】 运行结果: 2 5 32.000000
#include<stdio.h> double power(int x,int n) { int i; double p; p=1; for(i=1;i<=n;i++) p*=x; /* p=p*x */ return p;} void main() { int x,n; double num; scanf("%d%d",&x,&n); num=power(x,n); printf("%lf\n",num); } 【例8-4】
函数的返回 见【例8-4】当执行到return语句时,被调用函数结束,程序流程返回到主调用函数,并通过return语句把返回值带回到主调用函数, 。
形参与实参 形参是变量,实参是形参的值。 函数定义时是形参。主调用函数通过形参把数据传递给被调用函数。 函数执行时是实参。在主调用函数执行调用一个函数时,函数名后面的圆括号中的参数称为实参。 定义函数时指定的形参,在未出现函数调用时,形参并不占用内存单元,只有函数被调用时才分配给内存单元。 实参有确定的值,可以是常量、变量或表达式,在函数调用时实参的值赋给形参。 注意:实参的值必须与形参类型相同。见【例8-7】
#include<stdio.h> void main() { int i,j; void print(int,int); i=1,j=2; print(i,j); printf("i和j的值=%d,%d\n",i,j);} void print(int x,int y) x++; y++; printf("x和y的值=%d,%d\n",x,y);} 【例8-7】 运行结果: X和y的值=2,3 i和j的值=1,2
函数调用的一般过程 1)主调用函数首先为每个形参分配存储单元,然后把实参值复制到对应形参的单元中。 注意:实参与形参按位置一一对应,而不是按变量名对应。 2)将控制转移到被调用函数,执行函数体内的语句。 3)函数体执行完毕后,执行return语句,控制返回到主调用函数的调用处,从此调用点继续执行主调用函数下面的操作。见【例8-8】
#include<stdio.h> void main() { int i=2,p; int f(int,int); p=f(i,++i); printf("%d\n",p); } int f(int x,int y) printf("%d %d\n",x,y); int c; if(x>y) c=1; else if(x==y) c=0; else c=-1; return c; 【例8-8】 运行结果: 3 3
库函数的调用 C语言提供了丰富的库函数,正确使用这些函数,可以不必自己编写,省去很多时间。 调用C语言标准库函数要求有#include预处理命令, include必须以#开头。 C系统提供的头文件以.h为后缀,文件名要用一对双引号” ”或尖括号< >括起来。 Include不是C语句,后面不能加分号;。
常用的库头文件 stdio.h :输入/输出库函数 在VC++2012中用 “stdafx.h” 代替stdio.h math.h、stdlib.h、float.h :数学库函数 time.h :时间库函数 ctype :字符分类和转换库函数 string.h :字符串处理库函数 malloc.h、stdlib.h :内存分配库函数 signal.h、process.h :进程控制库函数
函数的嵌套调用 C语言中,一个函数不能在另一个和函数中定义,但可以嵌套调用。 当一个函数作为被调用函数时,它也可以作为另一个函数的主调用函数,而它的被调用函数又可以调用其它的函数,这就是函数的嵌套调用。
函数的嵌套调用 main函数 a函数 b函数 调用a函数 调用b函数 结束 返回main函数 返回a函数
局部变量和全局变量 在一个函数内部定义的变量是内部变量,它只在本函数范围内有效。 全局变量可以为本文件内其它函数共用,它的有效范围从定义变量的位置开始到本文件结束。
变量的存储类型 C语言有两种属性:数据类型和存储类型 一个完整的变量的定义是: 存储类型标示符 数据类型标示符 变量名; 存储类型标示符 数据类型标示符 变量名; C语言的4种存储类型:auto(自动),extern(外部),static(静态),register(寄存器)。 存储类型缺省为auto。
动态存储和静态存储 静态存储区----固定的分配给某些数据,程序在整个运行过程中都可以使用这些数据。如全局变量就存储在静态存储区,在整个程序运行中,全局变量一直占据这些存储单元。 动态存储区----在程序运行期间根据需要分配给不同的数据,当程序进入它的作用范围,就会在动态存储区为其分配存储单元,一旦程序离开了它的作用范围,这些分配的存储单就会被释放,如局部变量。函数的形参就是在动态存储区分配存储单元。
动态变量 auto 每个函数中定义的变量默认为auto,C系统在动态存储区中为它们分配存储单元,函数的形参和函数内定义的变量都是这种类型。只有当函数被调用时,这些变量才能被分配存储单元,函数调用结束,这些变量占用的存储单元被释放。 定义变量时可以显式的加auto来标识 [auto] 数据类型 变量名 [=初值表达式],……; 例如: auto int a;
寄存器变量 register 计算机的CPU中有多个寄存器,把数据放在这些寄存器里,其处理和传输速度比放在内存里快得多。 例如: register int a; 当一个变量被频繁使用,使用寄存器变量可以节省很多时间。
局部静态变量static 局部静态变量在程序运行过程中都占用内存单元,在其所在的函数被调用时,它才可以被使用,函数结束后,此变量仍然在内存中,且保持其内容不改变。 为何要使用这样的一种局部静态变量? 有时需要局部变量在函数结束后不消失且保留原值,其占用的存储单元也不释放,下次再调用此函数时可以使用上次函数结束时的值。这就需要使用局部静态变量。
定义局部静态变量static 定义局部静态变量,格式如下: static 数据类型 变量名 [=初始化表达式],……; 例如: static int a;
外部变量 外部变量的生命周期是整个执行过程,其存储类型标识是extern 。 建立静态外部变量,其内容可以由各个函数填入。
在一个文件内声明外部变量 如果外部变量不在文件的开头定义,它的作用域仅限于定义处到文件结束。 如果在定义之前的函数想要引用该外部变量,应该在引用之前用extern声明该变量,有了此声明,就可以从声明处起,合法的使用此外部变量。 变量的语句放在所有函数之前,这些函数就不必用extern声明外部变量了。其作用跟全局变量基本相同。
在多个文件中声明外部变量 如果一个C程序由多个程序文件组成,可以在一个文件引用另一个文件中已经定义的外部变量,起到共享变量交换数据的作用。 例如一个程序包含2个文件,这2个文件都要用到变量A,不能分别在2个文件中都定义一个外部变量A,否则会出现重复定义。 正确的做法是:在1个文件中定义1个外部变量A,而在另1个文件中用extern对A做外部变量声明。见【例8-29】
【例8-29】 File1.c #include "stdio.h" int A; void main() { int power(int); int c,d,m; printf("enter the A and m :\n"); scanf("%d%d",&A,&m); c=A*m; printf("%d*%d=%d\n",A,m,c); d=power(m); printf("%d**%d=%d\n",A,m,d); system("pause"); } File2.c #include "stdafx.h" int extern A; int power(int n) { int i,y=1; for(i=1;i<=n;i++) y*=A; printf("%d\n",y); return(y); }
如:static int fun(int a,int b); 如:extern int fun(int a,intb); 内部函数和外部函数 内部函数只能被本文件中其它函数调用,定义时在前面加static,又称静态函数。 如:static int fun(int a,int b); 外部函数可供其它文件调用,定义时在前面加extern。 如:extern int fun(int a,intb);