《C语言》第7章-2_函数

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。


#include <stdio.h> float average(int stu[10], int n); void main() { int score[10], i; float av; printf("Input 10 scores:\n"); for( i = 0; i < 10; i++ ) scanf("%d", &score[i]); av = average(score,10); printf("Average is:%.2f", av); }
变量的作用域
全局有效
国家级政策法规 省 市 级 政 策 法 规 省 市 级 政 策 法 规
局部有效
局部变量
float read(int a) { int b, c; ……. }
char save(int x, int y) { int i, j; …… } void main() { int m, n; ……. }
j j
1 1
第1次调用 第2次调用
j 1 第3次调用
静态局部变量 函数调用时,静态局部变量值可以保留,而不 是每次调用后就消失。
j为静态 变量 void test()
{
static int j = 0; ++j;
j
1 2
第1次调用 第2次调用 第3次调用
printf("%d\n", j);
}
3
静态全局变量 普通全局变量和静态全局变量
arr 7 11 调用前 arr x 7 11 调用 arr x arr 11 7 交换 11 7 返回
数组名作为函数参数
数组名作为函数参数 在主调函数与被调函数分别定义数组,且类型应一致
形参数组大小(多维数组第一维)可不指定
数组名做为实参是将数组的首地址传给形参
形参数组和实参数组所对应的是内存的同一个区域。
自动变量
函数内凡未加存储类型说明的变量均视为自动变量,也就是
说自动变量可省去说明符auto。(atuo变量不可以为全局变量)
float read(int a) {
int b, c; …… }
float read(int a) {
auto int b, c;
…… }
寄存器变量 为提高运行效率,C语言允许把局部变量直接 存放在寄存器中,存放在寄存器中的变量叫做寄 存器变量。(只可以是局部整型变量)
全局变量和局部变量 演示
#include <stdio.h> int a = 3, b = 5; int max(int a, int b) { int c; c = a > b? a : b; return c; } void main() { int a = 10; printf("max = %d\n", max(a, b)); }
函数调用开始到调用结束 本函数内或复合语句内 每次调用时 不确定
只在编译时赋初值一次 自动赋为0或空字符
内部函数与外部函数
对于一个多文件的C程序,根据一个函数能否调用其它程序 文件的函数,可将函数分为:内部函数和外部函数
内部函数
如果一个函数只能被本文件中其他函数调用称为 内部函数。
外部函数
外部函数在整个工程中都有效,也即它能够被
实参用数组名
求学生的平均成绩
形参用数组定义, int stu[ ]
float average(int stu[10], int n) { int i; float av,total=0; for( i = 0; i < n; i++ ) total += stu[i]; av = total/n; return av; } stu score
排序过程: (1)比较第一个数与第二个数,若为逆序a[0]>a[1],则交换;然 后比较第二个数与第三个数;依次类推,直至第n-1个数和第 n个数比较为止——第一趟冒泡排序,结果最大的数已“沉底” 在最后一个元素位臵上 (2)对前n-1个数进行第二趟冒泡排序,结果使次大的数被安臵在 第n-1个元素位臵 (3)重复上述过程,共经过n-1趟冒泡排序后,排序结束
全局变量
char c1, c2; float read(int a) { int b, c; ……. } double d1, d2; char save(int x, int y) { int i, j; …… } void main() { int m, n; ……. }
全局变量作用域: 定义处开始到本源文件结束。
演示
演示外部变量的作用
外部变量的作用
#include <stdio.h> void main()
{
extern a, b;
printf("sum = %d\n", a + b); }
int a = 5, b = 3;
对比
局部变量 存储类别 存储方式 存储区 生存期 作用域 赋初值 未赋初值 动态区 auto 动态 寄存器 register 局部static 全局变量 外部static 静态 静态区 程序开始到程序结束 本文件 所有文件 普通外部
变量的4种存储类型
作业
int d = 1; void fun(int x) { int d = 3; d += x; printf("%d", d); } void main() { int x = 2; fun(x); d += x; printf("%d\n", d); }
作业
编写函数实现求学生的平均身高,身高数组与学生数量是函 数的参数。平均身高作为返回值。 提示:在主函数中通过键盘输入10个学生身高存放在一维数 组中。调用计算平均身高的函数得到学生平均身高的值,输 出此值。
全局变量
•有返回值的话,函数调用只能带回一个返回值 •有时可以利用全局变量增加与函数联系的渠道,从函数得到 一个以上的值 •一般将全局变量名的第一个字母用大写表示,例如Max, Min
•建议不在必要时,不要使用全局变量 1.在程序执行的过程中都占用存储单元,而不是在需要才分配。 2。函数的通用性,互相独立性降低,因为函数在执行时要依 赖外部变量。 函数的功能要单一,独立性要强,互相影响尽量要少
语法
规范
思想
嵌入式编程基础
主讲:王晓翠
—— C语言
知识回顾
自定义函数的定义和调用 函数的参数传递
函数
变量作用域:局部变量与全局变量
函数的声明与函数的返回值

7

函 数
本章目标
理解数组作为函数的参数 理解变量的作用域 理解变量的存储类型 内部函数与外部函数 小结

#include <stdio.h> void swap(int a,int b); void main() { int x=7,y=11; printf("x=%d,\ty=%d\n",x,y); printf("swapped:\n"); swap(x,y); printf("x=%d,\ty=%d\n",x,y); } void swap(int a,int b) { int temp; temp=a; a=b; b=temp; }
交换两个数
x: x: 7 7 7 7 11 temp y: y: b: y: b: 11 11 11 11 7
调用前:
调用: a: swap: x: a:
调用结束:
x:
7
y:
11
例 数组名作函数参数,实现两个数交换
#include <stdio.h> void swap2(int x[]) { int temp; temp = x[0]; x[0] = x[1]; x[1] = temp; } void main() { int arr[2] = {7,11}; swap2(arr); printf("arr[0]=%d\narr[1]=%d\n",arr[0],arr[1]); }
作业
习题:多个函数(各个文件中)实现任意输入5个学生学号 和姓名按从小到大顺序输出。要求编写三个函数功能分别是 输入函数、排序函数、主函数。将这三个函数写在三个文件 中。
作业
习题:有一个一维数组,内放10个学生成绩,写一个函数, 求出平均分,最高分和最低分。 提示:显然希望从函数得到3个结果值,除了可得到一个函 数的返回值以外,还可以利用全局变量。平均分作为函数 的返回值,最高分和最低分利用全局变量得到。
作业
习题:多个函数(各个文件中)实现任意输入5个数字按从 小到大顺序输出。要求编写三个函数功能分别是输入数字函 数、排序函数、主函数。将这三个函数写在三个文件中。 提示:用冒泡法实现排序。
静态全局变量就是在全局变量的定义之前在用 static进行修饰 全局变量本身就是静态存储方式
静态全局变量当然也是静态存储方式 非静态全局变量的作用域是整个源程序 静态全局变量限制了其作用域,即只在定义 该变量的源文件内有效
外部变量
如果在定义处之前的函数中想引用某个外部 变量,则应该在引用之前用关键字extern对该变 量作外部变量声明,声明该变量是一个已经定义 的外部变量。
a,b,c有效 局部变量作用域:从定 义处开始到当前语句块 结束为止 x,y,i,j有效
m,n有效
局部变量
char save(int x, int y) { int i, j; …… if(i > 0) { int k; …… } }
在函数体内部,用{ }括起 来的内容叫复合语句。
k有效,从定义处开始到 当前语句块结束为止
求最大值
存储类型
将变量从生存期的角度(时间的角度)来划分,又可 以将变量分为静态变量和动态变量。
程序区 静态存储区 程序区 动态存储区 全局变量 局部静态变量 形参 自动变量(未加static声明的局部变量) 函数调用现场保护和返回地址
存储类型
在C语言中每个变量都有两个属性:数据类型和 存储类型 存储类型:是指数据在内存中存储的方式 存储方式分为两大类:静态存储和动态存储 具体包含四种:自动的(auto), 静态的 (static),寄存器的(register),外部的 (extern) 存储类型 数据类型 变量名; auto int a;
程序的其它文件内的函数调用。
内部函数与外部函数 内部函数
内部函数的一般定义形式: static 函数类型 函数名(形参表)
外部函数
外部函数的一般定义形式: extern 函数类型 函数名(形参表)
总结
自定义函数的定义和调用 函数的形参和实参
函数
变量的作用域:局部变量和全局变量
自动变量(auto) 寄存器变量(register) 外部变量(extern) 静态变量(static)
0 1 2 . . 9 12 23 56 …. …. 88
变量的作用域
变量从作用域的角度(即空间的角度)进行分类: 可以分为局部变量和全局变量
局部变量
局部变量也称为内部变量。局部变量在函数内 定义,且只在该函数内有效。
全局变量
全局变量也称为外部变量。全局变量在函数外 部定义,它不属于哪一个函数,有效范围为从定义 处开始到本源文件结束。
动态局部变量 函数调用时,系统会分配存储空间,在函数调用结 束时就自动释放其占用的存储单元。
#includ来自百度文库 <stdio.h> void test() { int j = 0; ++j; printf("%d\n", j); } void main() { int i; for(i = 1; i <= 3; i++) test(); } j为普通 变量
void main( ) { register int i; for(i = 1; i <= 100; i++) sum += i; printf(“sum = %d”, sum); }
当今的优化编译系统能 够识别使用频繁的变量, 从而自动将这些变量放 在寄存器中,而不需要 程序设计者指定。因此 在实际上用register声明 变量是不必要的。
c1,c2有效
d1,d2有效
全局变量
•编写一个函数,求圆的周长和面积
全局变量 演示
求圆的周长和面积
#include <stdio.h>
float get_area_circle(int r); void main() { int r = 10; float s, l; s = get_area_circle(r); l = get_area_circle(r); printf("s = %f, l = %f\n", s, l); } float get_area_circle(int r) { const float PI = 3.14; return PI * r * r; return 2 * PI * r; }
相关文档
最新文档