170 likes | 313 Views
C 语言程序设计. 同学们好!下面开始讲授 C 语言课程的第 11 讲内容。 第 11 、 12 讲 函数 一、函数的定义 二、函数的调用 三、变量的作用域 四、递归函数 五、函数指针 六、函数应用举例 第 11 讲 函数( 1 ) 一、函数的定义 二、函数的调用 三、变量的作用域(上). 第 11 讲 函数( 1 ) 一、函数的定义 二、函数的调用 三、变量的作用域(上). C 语言程序设计. 一、函数的定义 1 .函数定义格式
E N D
C语言程序设计 同学们好!下面开始讲授C语言课程的第11讲内容。 第11、12讲 函数 一、函数的定义 二、函数的调用 三、变量的作用域 四、递归函数 五、函数指针 六、函数应用举例 第11讲 函数(1) 一、函数的定义 二、函数的调用 三、变量的作用域(上) 第11讲 函数(1) 一、函数的定义 二、函数的调用 三、变量的作用域(上)
C语言程序设计 一、函数的定义 1.函数定义格式 [<有效范围>] <类型名> <函数名> (<参数表>) <函数体> 有效范围:由所使用的保留字extern或static决定,若使用extern则称为全局函数或外部函数;若使用static则称为局部函数或静态函数。若<有效范围>选项被省略,则默认为是全局函数。对于全局函数,能够在一个程序的其他每个程序文件中被声明和调用;对于局部函数,则只能被所在的程序文件声明和调用。 类型名:给出函数通过return语句返回的值的类型,当使用保留字void作为类型名时,则不需要返回值。 函数名:是用户为函数所起的名字,它是一个符合C语言命名规定的标识符。通常用函数名反映该函数的功能。如用SUM表示求和。 第11讲 函数(1) 一、函数的定义 二、函数的调用 三、变量的作用域(上)
C语言程序设计 参数表:又称形式参数表,它包含有任意多个参数说明,当多于一个时其前后两个参数说明项之间必须用逗号分开。每个参数说明包括类型名和参数名两项内容。 函数体:是一条复合语句,它以左花括号开始,到右花括号结束,中间为一条或若干条C语句。 函数头:在函数定义中,函数体之前的部分构成函数头,又称为函数原型。取出函数头再加上分号就构成该函数的原型声明语句。 2.函数定义格式举例 (1)void f1() {...} //返回无类型,无须返回值,函数名为f1 //参数表为空,即不带有任何参数。 (2)static void f2(int x) {...} //文件域函数,无返回类型,函数名 //为f2,带有一个int型参数x 第11讲 函数(1) 一、函数的定义 二、函数的调用 三、变量的作用域(上)
C语言程序设计 (3)int f3(int x,int* p) {...} //全局域函数,返回值类型为int, //函数名为f3,带有2个参数,一个为整型x,另一个为整型指针p (4)char* f4(char a[]){...} //返回类型为字符指针,函数名为f4, //带有一个一维字符数组参数a,标记为后跟一对中括号 (5)void f5(float c[][N], int m) {...} //无类型,函数名f5, //第1个为二维单精度型数组参数c,第2个为整型参数m。 //当定义一个二维数组参数时,第二维的尺寸必须给出,并且必须是一个常量表达式,而第一维尺寸可给出也可以不给出。第一维的实际尺寸通常需要由另一个整型参数m来表示。 3.函数定义和使用的几点说明 函数定义位置:可以出现在整个程序的任一个程序文件内的任何位置。 第11讲 函数(1) 一、函数的定义 二、函数的调用 三、变量的作用域(上)
C语言程序设计 函数原型声明语句:在利用函数调用表达式调用一个函数之前,必须出现有该函数的原型声明语句或函数定义。如void f1(int x,int y); 函数的常量形参:即在一般的形参说明项前加上const修饰。如: void f6(const float x, float y) {...} //x常量形参,y一般形参 void f7(const char* a, char* b) {...} //a常量形参,b一般形参 在f6函数体中只能读取x的值,不能改变它的值,对y可任意操作。 在f7函数体中只能读取a所指的字符或字符串,不能改变它,对b任意。 一维数组参数说明项的格式:<数据类型> <数组名>[] 等价于指针参数说明:<数据类型> *<指针变量名> 第11讲 函数(1) 一、函数的定义 二、函数的调用 三、变量的作用域(上)
C语言程序设计 指针变量名就是数组参数说明中的数组名。如一个函数定义中的数组参数说明 int a[ ]//数组参数说明,指向int类型元素的指针 int* a//等价于指针参数说明 当调用它们时,对应的实参为同类型的数组名,访问它们既可以是指针方式也可以是下标方式。 二维数组参数说明项格式:<数据类型> <数组参数名>[ ][<列数>] 等价的指针参数说明:<数据类型> (*<指针参数名>)[<列数>] 如假定一个函数定义中的: 二维数组参数说明:float c[ ][N] 等价于指针参数说明:float (*c)[N] 第11讲 函数(1) 一、函数的定义 二、函数的调用 三、变量的作用域(上)
C语言程序设计 当调用它们时,与c对应的实参为具有相同列数N的二维数组名,访问它们既可以是指针方式也可以是下标方式。 4.编写具体函数定义举例 例1:编写一个函数定义,求3个整数中的最大值。 int MaxValue(int x, int y, int z)//用x,y,z分别表示3个整数形参 { int w;//w作为临时变量,存放大者 if (x>=y) w=x; else w=y;//x和y中的大者赋给w保存 if (w>=z) return w; else return z;//返回w和z中的大者 } 第11讲 函数(1) 一、函数的定义 二、函数的调用 三、变量的作用域(上)
C语言程序设计 例2:编写一个函数定义,求n个整数中的最大值。 分析:n个整数用一个一维数组a来表示,n也是一个整型参数,采用顺序比较的方法查找出数组a[n]中的最大值。 int MaxArray(int a[], int n)//数组参数和表示数组长度的参数 {// int a[]可改为int* a int x,i;//用x保存当前比较中的大者,i为循环变量 x=a[0];//把a中第1个元素值赋给x for (i=1; i<n; i++)//比较中的大者始终保存在x中 if (a[i]>x) x=a[i]; return x;//返回最大值 } 第11讲 函数(1) 一、函数的定义 二、函数的调用 三、变量的作用域(上)
C语言程序设计 二、函数的调用 1.函数调用格式 <函数名> ( <实际参数表> ) 函数调用:又称为函数调用表达式。 函数名:在前面已经声明或定义了的函数名称,否则在编译时将报错。 实参表:可含0、1或多个用逗号分开的实参,每个实参可以为任何表达式。每个实参同函数定义或声明中的形参相对应。 2.格式举例 (1)fd1();//实参表为空 (2)fd2(bx, 10);//实参表有2个参数,一个为变量,一个为常量 (3)fd3(2*a-3);//实参表只有一个参数,它是一个算术表达式 第11讲 函数(1) 一、函数的定义 二、函数的调用 三、变量的作用域(上)
C语言程序设计 (4)double y=fd4(5, sin(x), b[3]);//常数、函数、下标变量 3.调用过程 第一步:参数传递。把实参的值传送给函数定义中对应的形参。 第二步:执行函数体。执行函数定义中的函数体。 第三步:返回。当执行到函数体中的任一条return语句或最后的花括号则返回。 4.参数传递 就是在函数调用时,自动把实参表中的每个实际参数的值向形参表中每个对应的形式参数传递的过程。此过程首先计算出每个实参值,接着为每个形参变量分配相应的存储空间,然后把每个实参值对应赋给每个形参变量中。 第11讲 函数(1) 一、函数的定义 二、函数的调用 三、变量的作用域(上)
C语言程序设计 举例1: int f1(int x, int y, int z)//参数为一般变量 { int w; if (x>=y) w=x; else w=y; if (w>=z) return w; return z; } int s=f1(25, 38, 30);//调用f1函数,返回值为38 int a=15, b=23, c=36,d; d=f1(a,b,c);//实参值不变,返回值36 举例2: void f4(int *x, int *y)//参数为指针变量 {//交换x和y所指向对象的内容,作用于实参变量 int w; 第11讲 函数(1) 一、函数的定义 二、函数的调用 三、变量的作用域(上)
C语言程序设计 w=*x; *x=*y; *y=w; } int a=25, b=18; f4(&a, &b);//把a和b的地址赋给x和y,实参值被交换 得到结果:a=18, b=25 举例3: void f5(int a[ ], int n)//int *a,参数为数组(指针)变量 {//按相反次序排列数组a[n]的n个数据,作用于实参数组 int i,w; for (i=0; i<n/2; i++) { w=a[i]; a[i]=a[n-1-i]; a[n-1-i]=w;//对称值对调 } } 第11讲 函数(1) 一、函数的定义 二、函数的调用 三、变量的作用域(上)
C语言程序设计 int b[5]={12,35,56,62,78}; f5(b,5); //把b的值传送给a,a也指向b,修改了数组b 得到结果:78,62,56,35,12 举例4: int f6(const int *a, int n) //a[],参数a所指对象不能被修改 { //返回数组a[n]中的n个整数之和 int i,sum=0; for(i=0; i<n; i++) sum+=*a++;//累加求和,只取值不修改 return sum; //若a[i]=5则编译出错 } int b[5]={5,8,4,10,20}; int x=f6(b,5); //把b的值传送给a,a也指向b //返回值47 第11讲 函数(1) 一、函数的定义 二、函数的调用 三、变量的作用域(上)
C语言程序设计 举例5: #include<stdio.h> #define Col 10 void f7(char (*a)[Col], int m);//函数原型说明 void main() { char b[3][Col]={"one","two","three"}; f7(b,3); //把b的值传送给a,输出b中3个字符串 } void f7(char (*a)[Col], int m) //二维数组参数a[][Col] { int i; for(i=0; i<m; i++) //输出每行字符串 printf("%s\n",a[i]); } 输出结果:one two three 第11讲 函数(1) 一、函数的定义 二、函数的调用 三、变量的作用域(上)
C语言程序设计 三、变量的作用域(上) 1.变量作用域的概念 程序中使用的每个变量都有它的作用域(有效区域),离开它的作用域该变量就不起任何作用了。变量的作用域从定义它的位置开始,到所在的程序模块结束。 2.作用域分类:全局、文件、函数、块 (1)全局域变量:在所有函数定义之外定义的变量,通常是在主程序文件的开始或头文件中定义,在该程序的所有文件里都有效,但在其他程序文件中使用时必须加以声明。全局变量若没有被初始化,则自动被赋值0。 (2)文件作用域变量:在所有函数定义之外定义的变量,通常是在每个程序文件的开始定义,此变量定义语句的开始必须使用static保留字。文件域变量的作用域属于所在的文件,若它没有被初始化,则也自动被赋值0。 第11讲 函数(1) 一、函数的定义 二、函数的调用 三、变量的作用域(上)
C语言程序设计 例如: #include<stdio.h> #define NN 15//相当于文件域常量 int x=3,y;//全局变量,x值3,y值0 static double a,b;//文件域变量,初值均为0.0 const int MM=20;//全局域常量 void main() {…}//可以使用以上定义的任何常量和变量 //在同一程序的其他程序文件中,经声明后只能使用上面的全局量 //声明格式为:extern int x,y; extern const int MM; (3)函数作用域:专指语句标号,供goto语句用。goto语句只能转移到本函数定义中的一个带有语句标号的位置。 第11讲 函数(1) 一、函数的定义 二、函数的调用 三、变量的作用域(上)
C语言程序设计 (4)块作用域变量:又称为局部变量。一种情况:在一条复合语句内定义,作用域从定义点开始到复合语句结束。另一种情况:函数定义中的形参变量,作用域为整个函数体。 这一讲就到这里,同学们再见! 第11讲 函数(1) 一、函数的定义 二、函数的调用 三、变量的作用域(上)