关于函数概述

发布时间:2026/9/28 13:03:05

关于函数概述 目录一.什么是函数二.为什么需要函数三.函数的使用1.函数的形式参数与实际参数2.库函数的调用3.自定义函数的定义4.自定义函数的调用5.函数的声明6.函数的嵌套调用7.函数的链式访问四.传值调用和传址调用一.什么是函数函数就是 C 语言的一个功能模块有较强的独立性可以相互调用换句话说C 语言中函数是C语言的功能单位实现一个功能一个函数并且在一个函数里面可以调用 n 个函数即大函数调用小函数小函数又调用“小小”函数……等。二.为什么需要函数1.将功能封装成单个函数后方便代码的维护和bug的修改以及功能的更改。2.将功能整合成函数后有利于功能的多次利用换句话说当需要该功能的时候可以直接调用函数避免重复编写相同的代码使整体更加简洁。三.函数的使用1.函数的形式参数与实际参数实际参数真实传给函数的参数叫实参。实参可以是常量、变量、表达式、函数等。无论实参是何种类型的量在进行函数调用时它们都必须有确定的值以便把这些值传送给形参。形式参数形式参数是指函数名后括号中的变量因为形式参数只有在函数被调用的过程中才实例化分配内存单元所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。示例#includestdio.h int add(int x, int y) { return x y; } int main() { int a 10; int b 20; add(a, b); return 0; }这里函数中的 x,y 便是复制 a,b 而来的形式参数函数调用时的 a,b 便是实际参数。注函数的实参需要与函数形参个数相同且顺序相同数据类型一一对应。2.库函数的调用一些基础功能或操作总被频繁的使用。比如把数据信息按照一定格式打印到屏幕上printf拷贝字符串strcpy计算k的n次方pow等等C语言把这些基础功能或操作集成库并根据C语言的标准规定了库的标准统称为库函数。示例1#includestdio.h int main() { printf(2); return 0; }结构如下所示这里#includestdio.h 是声明库函数所属的头文件通过库函数内的函数 printf 将2打印在屏幕上。示例2#includestdio.h #includemath.h int main() { double a 4.0; printf(%lf, sqrt(a)); return 0; }结果如下图所示这里声明了另一个库函数所在的头文件 math.h并调用了函数 sqrt 求出了 a 的平方根。注在代码中使用库函数前应去学习网站搞清楚它的头文件参数和参数类型返回值和返回值类型库函数名库函数功能以及语法规则。3.自定义函数的定义示例int/*返回值类型*/ max/*函数名*/(int x, int y)/*函数参数*/ { return x y ? x : y;//函数体 }由上我们可以知道自定义函数由函数返回值类型、函数名、函数参数、函数体 组成。这里我们定义了一个函数返回值类型为 int 类型名为 max 、参数为两个 int 类型的函数返回两个参数中的最大值的函数。示例2int fun(int x) { return x * x; }这里我们定义了一个返回值类型为 int 类型函数名为 fun 、参数为一个 int 类型返回值为参数形式参数的平方 的函数。注函数定义时可以无参数当不需要返回值时可以将返回值类型位置天上void。函数定义时函数名不可重复。在一个函数中定义的变量只能在本函数中用 (局部变量)。4.自定义函数的调用示例#includestdio.h int/*返回值类型*/ max/*函数名*/(int x, int y)/*函数参数*/ { return x y ? x : y;//函数体 } int main() { printf(%d, max(3, 6)); return 0; }运行结果如下图所示这里我们通过调用函数 max 求出了 3和6 之中的最大的数。示例2#includestdio.h int fun(int x) { return x * x; } int main() { printf(%d, fun(3)); return 0; }运行结果如下图所示这里我们调用名为 fun 的函数求出参数 3 的平方。5.函数的声明如果使用用户自己定义的函数而该函数与调用它的函数即主调函数不在同一文件中或者函数定义的位置在主调函数之后则必须在调用此函数之前对被调用的函数作声明。示例#includestdio.h int fun(int x); int main() { printf(%d, fun(3)); return 0; } int fun(int x) { return x * x; }运行结果如下图所示由此我们可以知道函数的声明就是将函数的返回值类型函数名参数 放在调用函数时的上面换句话说就是告诉编译器有这么一个函数。注一个函数只能定义一次但是可以多次声明。6.函数的嵌套调用顾名思义就是在一个函数中再次调用函数这个函数可以是函数本身的也可以是其他函数。当函数自己调用自己时也被称为函数递归示例1#includestdio.h int fun(int x) { if (x 3) return 3; return fun(x - 1); } int main() { printf(%d, fun(10)); return 0; }运行结果如下图所示这里我们可以看到 fun 函数嵌套到 fun 函数中即在 fun 函数中再次调用 fun 函数当参数 x 为 3时返回3。示例2#includestdio.h int fun(int x) { return x - 1; } int max(int x, int y) { int c x y ? x : y; return fun(c); } int main() { printf(%d, max(10, 20)); return 0; }运行结果如下图所示相同的这里我们可以看到 max 函数中嵌套了 fun 函数通过函数max 求出10和20 中最大的值并在返回时嵌套调用函数 fun 将最大值减一。注函数嵌套的层级应该合理控制避免嵌套层级过深。 过多的嵌套层级会导致代码的可读性下降增加调试和维护的难度。函数的嵌套使用应当遵循顺序依赖。 即在调用一个函数之前被调用的函数必须已经定义。函数嵌套虽然提供了较高的灵活性但也增加了代码的复杂性。 在使用函数嵌套时需要权衡可读性和简洁性之间的关系避免过度使用函数嵌套。7.函数的链式访问简单来说函数的链式访问就是把一个函数的返回值作为另外一个函数的参数。示例#includestdio.h int add(int x) { return x 1; } int max(int x, int y) { return x y ? x : y; } int main() { printf(%d, max(10, add(19))); return 0; }运行结果如下图所示显而易见这里函数 add 的返回值用作函数 max 的参数函数 max 的返回值又用作函数 printf 的参数从而得到打印20的结果。四.传值调用和传址调用传值调用在函数调用过程中传值调用将实参的数据而不是地址传给了形参在被调用的函数中形参值改变了但是不影响主调函数的实参值。参数传递方向是由实参向形参单向传递。示例#includestdio.h int fun(int a) { a; printf(%d\n, a); return a; } int main() { int a 5; fun(a); printf(%d, a); return 0; }运行结果如下图所示易知传值调用时对形参的改变不影响实参。传址调用传址调用与传值调用不同传址调用是将实参变量的地址传给形参(此时形参是指针即让形参的指针指向实参地址)改变形参的同时也把实参改变了。#includestdio.h int fun(int* a) { (*a); printf(%d\n, *a); return *a; } int main() { int a 5; fun(a); printf(%d, a); return 0; }运行结果如下图所示可以发现 a 的值发生了改变。函数参数调用归根揭底就是创建一个新的变量形式参数将实际参数的内容复制到新变量中这里我们改变新变量的值和实际参数毫无关系但是传址调用通过地址可以找到存放数据的地方这时候改变数据就是改变实际参数。
延伸阅读

更多相关文章

2026/9/28 12:58:04

数据库表关系设计:一对一、一对多、多对多从理论到实战

做数据库也这么多年了,说实话,我见过太多线上系统出问题,最后排查来排查去,根子都在建表那一步——表关系没理清楚。要么是两张表耦合得乱七八糟,要么是该拆开的全塞进一张大表里,要么是多对多关系靠逗号分…

2026/9/28 12:58:04

用Go从零实现以太坊JSON-RPC客户端:协议解析与交易实战

最近在做以太坊相关的东西,越做越觉得有意思。网上聊go语言实现以太坊客户端的教程不少,但大多直接给你一个go-ethereum的rpc包让你对着文档调,真正从零把JSON-RPC这一层手写一遍的人不多。这篇文章我准备完整复盘一下自己用go语言从零实现一…

2026/9/28 17:13:33

Substrate入门实战:从模板到自定义Pallet的完整拆解

看到 substrate 这个词,不同背景的人会想到完全不同的东西:做材料的想到基板或底材,学生物的想到酶反应里的底物,而搞区块链开发的,多半会直接反应到那套用 Rust 写的区块链开发框架——Substrate。我第一次接触它时其…

2026/9/28 17:13:33

Substrate区块链开发框架实战:从零搭建第一条自定义链

substrate这个词在技术圈里一扔出来,懂行的人大概都知道你在说区块链领域里的那个模块化开发框架,而不是化学实验里的“底物”。作为Polkadot生态的核心技术底座,Substrate被越来越多想做链的团队盯上,过去要花一年半载从零手写一…

2026/9/28 17:13:33

harness-sdk 详解:Java 服务端功能开关与灰度发布实践

做后端十多年,功能开关这玩意儿从自己写 Redis 开关,到用开源方案,再到现在大部分项目放进 Harness 平台,算是一路踩坑踩过来的。harness-sdk 这个名字乍一看像某个内部项目代号,实际它就是 Harness 平台向开发者暴露的…

2026/9/28 17:13:33

森林害虫目标检测数据集实战:YOLO标注格式与训练全流程解析

简介:森林害虫目标检测数据集是一套面向林业害虫智能监测与农业生态保护的YOLO格式目标检测数据,覆盖松毛虫、松墨天牛、卷叶蛾三类常见且危害严重的害虫,适用于森林健康监测系统、无人机巡检、精准施药等AI模型的训练与验证。数据来源于实际…

2026/9/28 17:13:33

Substrate区块链开发框架:模块化造链原理与实操避坑指南

去年有个朋友拉我聊,说团队准备发一条自己的链,问我从哪下手。我给的回答很直接:去研究 Substrate,别从零造轮子。后来他花了两个月,真把一条带自定义业务模块的链跑起来了,跟我说这个框架把造链门槛拉低了…

2026/9/28 17:08:33

Substrate Runtime:WASM驱动的可验证执行基础设施

1. Substrate 不是“另一个区块链框架”:它本质是一套可验证的运行时编译基础设施很多人第一次听到 Substrate,第一反应是:“哦,又一个做公链的 Rust 框架,和 Cosmos SDK、Tendermint 差不多?”——这个理解…

2026/9/28 3:03:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/28 6:05:15

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/28 6:07:41

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/28 0:02:03

广州外贸网站建设推广:从零搭建全流程拆解与真实报价避坑

广州外贸网站建设推广:从零搭建全流程拆解与真实报价避坑 改个需求建站公司拖一周,后台改个文案还得再交一笔“技术维护费”。这种憋屈事儿,做外贸的朋友太熟悉了。很多老板在找广州外贸网站建设推广服务商时,光盯着首页好不好看,却忽略了从零搭建一个能…

2026/9/28 0:02:04

搞懂百度竞价推广价格,网站性能优化别掉链子

搞懂百度竞价推广价格,网站性能优化别掉链子 网站突然打不开,浏览器弹出红色警告“此网站存在安全风险”,后台一看全是乱码代码和奇怪的跳转链接。这种网站被黑挂马的绝望感,很多刚转行做网站的朋友都经历过,尤其是那些为了省几百块钱服务器费用的新手。…

2026/9/25 20:55:38

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/26 19:58:38

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/28 1:59:25

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑