2026/10/16 6:33:37

C语言课程.6函数的概念

C语言课程.6函数的概念 文章目录1. 函数的概念2. 库函数3. 自定义函数4. 形参和实参5. 数组做函数参数6. 嵌套调用和链式访问7. 函数的声明和定义7.1 两个关键字7.2 static 与 extern7.2.1 作用域与生命周期7.2.2 static7.2.3 extern 关键字1. 函数的概念C 语言中的函数就是一个完成某项特定任务的一小段代码。往大了说C 语言的程序其实是由无数个小的函数组合而成的也可以说一个大的计算任务可以分解成若干个较小的函数对应较小的任务完成。2. 库函数C 语言标准中规定了 C 语言的各种语法规则但 C 语言本身并不提供库函数。C 语言的国际标准 ANSI C 规定了一些常用函数的标准被称为标准库。不同的编译器厂商根据 ANSI 提供的 C 语言标准给出了一系列函数的实现这些函数就被称为库函数。正如我们之前学到的printf和scanf它们都属于库函数使用前需要通过#include 头文件进行声明。这里有两个链接可以帮助各位更好地学习 C 语言cplusplus.com3. 自定义函数与库函数相比自定义函数具有更强的自由性能够为我们创造出更多的可能性。自定义函数的基本语法如下ret_typefun_name(形式参数){}ret_type 返回值fun_name 函数名{} 括起来的是函数体举例写一个加法器//自定义函数intAdd(inta,intb){intaddab;returnadd;}intmain(){//定义变量inta4;intb5;//用 c 来存放返回值intcAdd(a,b);//打印 cprintf(%d,c);return0;}Add 函数也可以简化为intAdd(intx,inty){returnxy;}4. 形参和实参#includestdio.hintAdd(intx,inty)//形参{intz0;zxy;returnz;}intmain(){inta0;intb0;//输⼊scanf(%d %d,a,b);//调⽤加法函数完成a和b的相加//求和的结果放在r中intrAdd(a,b);//实参//输出printf(%d\n,r);return0;}实参调用 Add 函数时传递给函数的参数 a 和 b。形参在函数名 Add 后的括号中写的 x 和 y。这里我们通过控制台来看一下形参和实参的值和地址。形参是实参的一份临时拷贝。5. 数组做函数参数我们可以通过自定义函数来实现数组的输入和输出。举例//输入函数voidmy_scan(inta[10]){for(inti0;i10;i){scanf(%d,a[i]);}}//输出函数voidmy_print(inta[10]){for(inti0;i10;i){printf(%d ,a[i]);}}//主函数intmain(){inta[10];my_scan(a);my_print(a);return0;}注意函数的形式参数要和函数的实参个数匹配。函数的实参是数组形参也是可以写成数组形式的。形参如果是一维数组数组大小可以省略不写。形参如果是二维数组行可以省略但是列不能省略。数组传参形参是不会创建新的数组的。形参操作的数组和实参的数组是同一个数组。6. 嵌套调用和链式访问嵌套调用就是函数之间的互相调用。#includestdio.hintadd(inta,intb){returnab;}intmain(){// 嵌套调用add(1, 2) 先算结果再 3intresultadd(add(1,2),3);printf(%d\n,result);// 输出 6return0;}链式访问就是将一个函数的返回值作为另一个函数的参数像链条一样将函数串起来就是函数的链式访问。#includestdio.hintmain(){inta[3]{5,10,15};// 链式访问用循环依次访问每个元素for(inti0;i3;i){printf(a[%d] %d\n,i,a[i]);}return0;}7. 函数的声明和定义7.1 两个关键字在同一文件下。// 函数声明原型声明intadd(inta,intb);// 函数定义实现intadd(inta,intb){returnab;}intmain(){intresultadd(1,2);// 使用函数return0;}多个文件下。文件分工定义文件.c放函数的具体实现。声明文件.h放函数原型供其他文件 include。如图7.2 static 与 extern7.2.1 作用域与生命周期作用域是指程序设计中的一个基本概念。在一段程序代码中所用到的名字并不总是可用的而能够限定某个名字可用范围的代码区域就是这个名字的作用域。局部变量的作用域是它所在的局部代码块范围仅在该范围内有效。全局变量的作用域覆盖整个工程项目在程序各处均可访问。生命周期则描述的是从变量创建申请内存到变量销毁释放内存之间的一个时间段。局部变量的生命周期与其作用域一致进入作用域时创建生命周期开始一旦离开作用域生命周期随即结束。全局变量的生命周期则贯穿整个程序的运行周期。7.2.2 static作用于局部变量局部静态变量使局部变量变成全局变量。我们列举两段代码来说明。未使用 static#includestdio.hvoidtest(){inti0;i;printf(%d ,i);}intmain(){inti0;for(i0;i5;i){test();}return0;}使用 static#includestdio.hvoidtest(){//static修饰局部变量staticinti0;i;printf(%d ,i);}intmain(){inti0;for(i0;i5;i){test();}return0;}后一段代码的i变成了全局变量在打印时就出现了状况。存储期整个程序运行期间。作用域仅限于定义它的函数内部。生命周期程序启动到结束。作用于全局变量文件内部链接。只能在当前文件使用无法在别的文件调用。staticintglobal_var10;// 只在本文件可见作用于函数文件内部链接。只能在当前文件使用无法在别的文件调用。staticvoidhelper(){// 只在本文件可见// ...}7.2.3 extern 关键字声明外部变量externintglobal_var;// 声明在别处定义的全局变量告诉编译器该变量已在别处定义链接时会找到声明外部函数externintadd(inta,intb);// 声明在别处定义的函数默认情况下函数已是 extern可省略以上的 extern 都放在main.c中声明定义在add.c。