C语言:函数

张开发
2026/4/9 3:22:24 15 分钟阅读

分享文章

C语言:函数
C语言函数一.函数概念二.库函数1.什么是库函数2.如何使用库函数3.库函数文档的一般格式(以rand函数为例)三.自定义函数四.形参和实参五.return语句的详细使用六.数组做函数参数七.函数的嵌套调用和链式访问1.嵌套调用2.链式访问八.函数的声明和定义1.为什么要函数声明2.多个文件时九.关键字static和extern1.static介绍static修饰局部变量static修饰全局变量static修饰函数2.extern一.函数概念在 C 语言中函数是实现特定功能、相对独立的代码模块也是程序的基本组成单位。它由函数名、参数列表、函数体等部分构成可以接收外部传入的数据执行相应的处理逻辑并可返回处理结果。函数具有可重复调用的特点能够将复杂程序拆分为多个功能单一的模块既避免代码重复编写也让程序结构更清晰、易于维护和扩展而程序的执行则从main函数开始。一般分为两类函数库函数和自定义函数。二.库函数1.什么是库函数直白的说库函数 别人已经写好、封装好、你直接拿来用的函数。编程语言自带一批常用功能比如输入输出、数学计算、字符串处理这些功能被打包成 “函数库”你写程序时直接调用里面的函数不用自己重新写一遍逻辑例如想要打印一句话要用printf想要输入要用scanf想算平方根要用sqrt等等。这些都不是你自己写的而是语言自带的库函数。总结不用自己写直接调用的现成函数就是库函数。2.如何使用库函数库函数是在标准库中对应的头文件中声明的所以库函数的使用要包含对应的头文件。相关学习工具库函数相关头文件举个例子在此之前我们学过rand函数在使用rand函数时要包含头文件#include stdlib.h#includestdio.h#includestdlib.hintmain(){printf(%d\n,rand());printf(%d\n,rand());printf(%d\n,rand());return0;}运行结果3.库函数文档的一般格式(以rand函数为例)1函数原型2.函数功能介绍3.参数和返回类型说明4.代码举例5.代码输出6相关知识链接三.自定义函数自定义函数无非就是自己写代码创造出来的函数不包含在库函数里。例如#includestdio.hret_typefun_name(形式参数)//ret_type--函数返回类型{//函数体}intmain(){fun_name(形式参数);//函数名return0;}注意如果ret_type不知道返回什么可使用void明确表示函数没有参数如果有参数要交代清楚参数的类型和名字以及参数个数。举个例子输入2个整型类型的参数函数计算的结果也是整型#includestdio.hintAdd(intx,inty){returnxy;}intmain(){inta0;intb0;scanf(%d %d,a,b);intrAdd(a,b);printf(%d\n,r);return0;}四.形参和实参实参真实传递给函数的参数。形参只是形式上存在的不会向内存申请空间不会真实存在的如上述代码中的int x, int y所以叫形式参数。在上述代码中我们可以看到在main函数中int r Add(a, b);从scanf接收a和b这是实参而函数Add自己创建了int x, int y这是形参。形参中的x和y也可以用a和b来代替于实参字母相同最终效果都是一样的。如图所示#includestdio.hintAdd(inta,intb){returnab;}intmain(){inta0;intb0;scanf(%d %d,a,b);intrAdd(a,b);printf(%d\n,r);return0;}实参与形参之间的关系在VS里调试时x和y确实得到了a和b的值但是x和y的地址和a和b的地址是不⼀样的所以我们可以理解为形参是实参的⼀份临时拷贝。五.return语句的详细使用return后边可以是⼀个数值也可以是⼀个表达式如果是表达式则先执行表达式再返回表达式的结果。return后边也可以什么都没有直接写return; 这种写法适合函数返回类型是void的情况。return语句执行后函数就彻底返回后边的代码不再执行。return返回的值和函数返回类型不⼀致系统会自动将返回的值隐式转换为函数的返回类型。如果函数中存在if等分支的语句则要保证每种情况下都有return返回否则会出现编译错误。函数的返回类型如果不写编译器会默认函数的返回类型是int。函数写了返回类型但是函数中没有使用return返回值那么函数的返回值是未知的。六.数组做函数参数有时我们在写代码时难免会用到例如后续我们结合本章和之前所学的知识写一个简单的扫雷游戏中就要用到数组做函数参数。举个例子写⼀个函数将⼀个整型数组的内容全部置为-1再写⼀个函数打印数组的内容参考代码#includestdio.hvoidset_arr(intarr[],intsz){inti0;for(i0;isz;i){arr[i]-1;}}voidprint_arr(intarr[],intsz){inti0;for(i0;isz;i){printf(%d ,arr[i]);}printf(\n);}intmain(){intarr[]{1,2,3,4,5,6,7,8,9,10};intszsizeof(arr)/sizeof(arr[0]);//计算数组元素个数set_arr(arr,sz);//设置数组内容为-1print_arr(arr,sz);//打印数组内容return0;}七.函数的嵌套调用和链式访问1.嵌套调用嵌套调⽤就是函数之间的互相调⽤。大概结构框架#includestdio.hret_typefun_name2(形式参数){//函数体}ret_typefun_name1(形式参数){fun_name2(形式参数);}intmain(){fun_name1(形式参数);return0;}2.链式访问链式访问就是将⼀个函数的返回值作为另外⼀个函数的参数。举一个简单的例子求⼀个字符串的长度我们一般会这样写#includestdio.hintmain(){intlenstrlen(abcdef);printf(%d\n,len);return0;}如果再加以改进就会变为链式访问结构如代码所示#includestdio.hintmain(){printf(%d\n,strlen(abcdef));return0;}这便是链式访问八.函数的声明和定义1.为什么要函数声明我们先来看这种代码写法一般最后运行结果是不会出错的#includestdio.hret_typefun_name1(形式参数){}intmain(){fun_name1(形式参数);return0;}我们再来看看这种代码写法我们去调试会报错这是因为程序是自上而下运行的但走到fun_name1(形式参数)时在前面编译器没有遇到过ret_type fun_name1(形式参数)结果就会报错#includestdio.hintmain(){fun_name1(形式参数);return0;}ret_typefun_name1(形式参数){}那我们又该如何解决呢这就得在main函数前使用函数声明#includestdio.hret_typefun_name1(形式参数)intmain(){fun_name1(形式参数);return0;}ret_typefun_name1(形式参数){}再次调试程序结果成功了总结函数的调用⼀定要满足先声明后使用函数的定义也是⼀种特殊的声明所以如果函数定义放在调用之前也是可以的。2.多个文件时上述情况是在单个文件的情况下但我们写代码不可能把所有代码都放在一个文件里面吧所有可以把代码拆分放在多个文件中。⼀般情况下函数的声明、类型的声明放在头文件后缀为.h中函数的实现是放在源文件后缀为.c文件中。操作方法:右击源文件添加新建项然后有两个选项一个是.c后缀的c文件另一个是.h后缀的头文件。如图所示其中game.h为函数声明game.c为函数的定义test.c为程序逻辑即main函数所在文件九.关键字static和extern1.static介绍static是静态的意思其作用修饰局部变量修饰全局变量修饰函数static修饰局部变量static 局部变量相当于只会初始化一次、能记住上次值的 “长寿局部变量”延长了程序生命周期。我们将普通的局部变量与static修饰过后的局部变量进行对比普通的局部变量1.函数一调用就创建函数一结束就销毁下次调用重新开始。static修饰的局部变量1.只在第一次调用时创建之后一直活着不会消失。2.下次再调用这个函数它会记住上一次的值不会重置。例如voidtest(){staticinta0;a;printf(%d ,a);//第一次调用test时a1//第二次调用test时a2//第三次调用test时a3......}static修饰全局变量static修饰全局变量就是把这个变量 “锁在当前文件里”不让别的文件访问。我们将正常的局部变量与static修饰过后的全局变量进行对比正常全局变量1.整个项目所有.c文件都能访问、修改2.很容易被别的文件不小心改掉不安全static修饰的全局变量1.只能在当前这个.c文件里用2.别的文件看不见、用不了、改不了3.相当于给变量加了个本文件专属的限制static修饰函数简单的来说普通函数时整个项目里所有文件都能调用的而我们static修饰后的函数相当于这个函数只给自己所在的 .c 文件用别的文件调用不了例如我们在上面的game.c文件里某个函数前面加上一个static来修饰那么我们的test.c文件对应的函数想调用是不可能的如下所示2.externextern是用来声明外部符号。如果⼀个全局的符号在A文件中定义的在B文件中想使⽤就可以使用extern进行声明然后使用。如下所示然后我们开始调用最后成功打印100那如果我们在int hhh 100;前面加上static后还会成功打印100吗结果是不会的因为我们在此之前已经明确说明了当static修饰全局变量就是把这个变量 “锁在当前文件里”不让别的文件访问。

更多文章