news 2026/4/18 1:08:33

零基础学习c语言---函数

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
零基础学习c语言---函数

(一)函数的概念

在我们平时学习数学时,会经常用到函数,一次函数,二次函数,反函数……而在c语言中也引入了函数的概念。

(二)库函数

在c语言中的函数一般分为库函数和自定义函数。库函数在我们之前的学习中就已经学习了一部分。比如printf,scanf都是常见的库函数,而库函数在c语言中是现成的,只要学会了就可以直接用,比如printf输出数据,scanf输入数据,而它们的使用必须在相应的头文件里进行,输入输出必须报含头文件#include <stdio.h>,sqrt()函数,也就是计算平方根,它则必须报含头文件#include<math.h>

(三)自定义函数

除了库函数外,c语言中还有自定义函数,它的形式如下

ret_type fun_name() { } //ret_type是函数返回类型 //fun_name是函数名 //()里的放形式参数 //{}里放的是函数体

它不像库函数一样,我们学会了就可以直接使用,它是需要我们给它规定它要完成的任务。

注意⚠️:我们在使用函数时,要将函数的参数部分交代清楚,1:参数个数。2:每个参数的类型是什么。3:形参的名字。比如我们想要完成一个加法运算,那么我们就可以写一个加法函数Add(),如下代码

#include <stdio.h> int Add(int x,int y)//x,y是形式参数 { int z=0; z=x+y; return z; } int main() { int a=0; int b=0; scanf("%d %d",&a,&b); int r=Add(a,b); //a,b是实际参数 printf("%d\n",r); return 0; }

在上述代码中,加法函数括号里的是形式参数,而在主函数里的加法函数括号中的是实际参数。实际参数和形式参数虽然有联系,但是它们是各自独立的,在上述代码中,当我们调用了加法函数Add()时,里面的形式参数才会向内存申请空间,如果没有调用加法函数,那么Add函数的参数x,y就不会向内存申请空间,就不是真实存在

(四)return语句

在函数的设计中,会经常出现return语句。这里是使用return语句的几个注意事项⚠️

1:return后面可以是数值,像上方Add函数,return后面也可以直接是表达式,比如下方Add函数

#include <stdio.h> int Add(int x,int y)//x,y是形式参数 { return x+y; } int main() { int a=0; int b=0; scanf("%d %d",&a,&b); int r=Add(a,b); //a,b是实际参数 printf("%d\n",r); return 0; }

2:return后面也可以什么都没有,适合函数返回值类型是void的情况,比如下方代码

#include <stdio.h> void print_num(int x,int y)//无需返回值,类型是void,直接打印x,y { x=2; y=5; printf("%d %d",x,y); } int main() { int a=0; int b=0; print_num(a,b); return 0; {

3:return语句执行后,函数就会彻底返回,后面的代码不执行,比如下方代码

#include <stdio.h> void test_return() { printf("函数开始执行\n"); return; printf("return后的代码不会执行\n");//这一行代码不会执行 } int main() { test_return(); return 0; }

(五)数组作函数参数

在使用函数时,我们除了用普通的数据作为参数外,在日后的学习种肯定还会使用到数组作为函数参数。在使用数组作为函数参数时,我们需要将数组,以及数组的个数作为参数传递给函数,比如下方函数

#include <stdio.h> void print_arr(int arr[],int sz) { int i=0; for(i=0;i<sz;i++) { printf("%d\n",arr[i]);//打印出数组里的每个元素 } } int main() { int arr[]={0,1,2,3,4}; int sz=siof(arr)/sizeof(arr[0]));//计算数组元素的个数 print_arr(arr,sz);//实际参数传入数组arr和数组元素个数 return 0; }

(六)函数之间的相互调用

我们不仅能在主函数里调用我们设置的自定义函数,我也可以在我们设置的函数里再次调用我们设置的新函数,比如我们想写一个代码,要求出某年某月有多少天,首先我们可以设置一个函数,在里面存入每个月有多少天,但是因为有闰年的存在,我们可以利用前面的知识在再设置一个判断是否为闰年的函数,再在第一个函数里调用判断是否为闰年的函数,如果是,那么就要在2月份的天数上多加一天。具体代码实现如下

#include <stdio.h> int is_leap_year(int year) { if (year % 4 == 0 && year % 100 != 0 || year % 400 == 0) { return 1; } else return 0; } month_of_days(int year,int month) { int days[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 }; int day = days[month]; if (is_leap_year(year) && month == 2)//调用了判断是否为闰年的函数 day += 1; return day; } int main() { int year = 0; int month = 0; scanf("%d %d", &year, &month); int d=month_of_days(year,month); printf("%d", d); return 0; }

(七)printf函数的返回值

这里我们补充一个printf返回值,printf函数返回的是打印再屏幕上字符的个数,如下代码

printf("%d",printf("%d",printf("%d",33)); //33是两个字符,所以返回2 //2是一个字符,所以返回1 //最终结果是3321

最终在屏幕上打印的是什么呢 没错,是3321

(八)函数的声明和定义

在我们上述代码的使用中,函数都是直接放在主函数前面的,但如果我们将函数放在主函数后面的话,如下代码

#include <stdio.h> int main() { int a=0; int b=0; scanf("%d %d",&a,&b); int r=Add(a,b); //在前面没有发现Add函数 printf("%d\n",r); return 0; } int Add(int x,int y) { int z=0; z=x+y; return z; }

会出现错误,因为在调用函数时,程序从前往后运行,当我们要使用这个函数时,程序发现前面并没有出现这个函数,所以会出现错误,想要纠正这个错误也很简单,不必将整个函数放在前面,只需要在主函数前声明一下要用的这个函数就可以,可以修正成如下形式

#include <stdio.h> int Add(int x,int y); int main() { int a=0; int b=0; scanf("%d %d",&a,&b); int r=Add(a,b); //在前面没有发现Add函数 printf("%d\n",r); return 0; } int Add(int x,int y) { int z=0; z=x+y; return z; }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 1:07:00

如何防止SQL注入利用存储过程_确保存储过程不拼字符串

必须用sp_executesql代替EXEC实现参数化查询&#xff0c;严格声明参数类型与长度&#xff0c;对表名列名等动态部分采用白名单校验&#xff0c;并对输入参数做强类型声明和范围检查。存储过程中用 sp_executesql 代替 EXEC 才安全直接拼接字符串再执行&#xff0c;哪怕在存储过…

作者头像 李华
网站建设 2026/4/18 1:05:55

程序员的未来在何方?腾讯自爆程序员90%的代码都由AI完成!

不知道大家最近有没有看一个新闻&#xff0c;程序员90%的工作都可以由AI完成&#xff0c;那么程序员未来在哪里呢&#xff1f;今天这篇文章不塑造焦虑&#xff0c;讲讲我个人的故事。去年6月份&#xff0c;我做了一个连自己都觉得疯狂的决定&#xff1a;裸辞&#xff0c;All in…

作者头像 李华
网站建设 2026/4/18 0:53:27

​科捷智能:锂电材料行业智能工厂物流构建实践

锂电材料行业的智能工厂物流构建&#xff0c;本质上是一场与金属污染、信息断裂和安全风险的系统性博弈。市场上不乏提供单一设备或局部方案的供应商&#xff0c;但能够将洁净控制、数据贯通与安全合规整合为一体化交付能力的厂商依然稀缺。科捷智能在锂电材料行业的持续深耕&a…

作者头像 李华
网站建设 2026/4/18 0:53:22

数据库性能优化实战

系列导读&#xff1a;本篇将深入讲解数据库性能优化的核心方法与实战技巧。 文章目录一、SQL 优化1.1 慢查询分析1.2 EXPLAIN 解读1.3 优化原则二、索引优化2.1 索引类型2.2 索引设计原则2.3 组合索引示例三、架构优化3.1 读写分离3.2 分库分表3.3 缓存策略四、连接池优化4.1 H…

作者头像 李华
网站建设 2026/4/18 0:52:19

RISC-V Debug实战解析(一):基于JTAG协议的调试模块Verilog设计

1. 从零理解RISC-V调试系统架构 第一次接触RISC-V调试系统时&#xff0c;我被文档里那些缩写词搞得头晕眼花——DTM、DMI、DM这些概念就像天书一样。直到亲手用Verilog实现了一个JTAG调试模块&#xff0c;才真正搞明白它们之间的关系。想象你正在用电脑调试一块RISC-V开发板&am…

作者头像 李华
网站建设 2026/4/18 0:49:52

DeepSeek总结的我们所熟知的互联网即将终结

我们所熟知的互联网即将终结 2026-04-15 | 1201词 上周&#xff0c;Anthropic 公司宣布&#xff0c;其最新的人工智能模型 Claude Mythos 预览版将不会向公众发布&#xff0c;此前该公司获悉&#xff0c;该模型能够发现并利用那些在关键软件系统中潜藏了数十年未被察觉的漏洞…

作者头像 李华