news 2026/9/28 13:03:00

关于函数概述

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
关于函数概述

目录

一.什么是函数:

二.为什么需要函数:

三.函数的使用:

1).函数的形式参数与实际参数:

2).库函数的调用:

3).自定义函数的定义:

4).自定义函数的调用:

5).函数的声明:

6).函数的嵌套调用:

7).函数的链式访问:

四.传值调用和传址调用:


一.什么是函数:

函数就是 C 语言的一个功能模块,有较强的独立性,可以相互调用,换句话说,C 语言中,函数是C语言的功能单位,实现一个功能一个函数,并且在一个函数里面可以调用 n 个函数,即大函数调用小函数,小函数又调用“小小”函数……等。

二.为什么需要函数:

1.将功能封装成单个函数后,方便代码的维护和bug的修改以及功能的更改。

2.将功能整合成函数后有利于功能的多次利用,换句话说,当需要该功能的时候,可以直接调用函数,避免重复编写相同的代码,使整体更加简洁。

三.函数的使用:

1).函数的形式参数与实际参数:

实际参数:

真实传给函数的参数,叫实参。
实参可以是:常量、变量、表达式、函数等。
无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形
参。

形式参数:

形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内
存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数
中有效。
示例:

#include<stdio.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:

#include<stdio.h> int main() { printf("2"); return 0; }

结构如下所示:

这里#include<stdio.h> 是声明库函数所属的头文件,通过库函数内的函数 printf 将2打印在屏幕上。

示例2:

#include<stdio.h> #include<math.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 类型的函数,返回两个参数中的最大值的函数。

示例2:

int fun(int x) { return x * x; }

这里我们定义了一个返回值类型为 int 类型,函数名为 fun 、参数为一个 int 类型,返回值为参数(形式参数)的平方 的函数。

注:函数定义时,可以无参数,当不需要返回值时,可以将返回值类型位置天上void。

函数定义时函数名不可重复。

在一个函数中定义的变量,只能在本函数中用 (局部变量)。

4).自定义函数的调用:

示例:

#include<stdio.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:

#include<stdio.h> int fun(int x) { return x * x; } int main() { printf("%d", fun(3)); return 0; }

运行结果如下图所示:

这里我们调用名为 fun 的函数,求出参数 3 的平方。

5).函数的声明:

如果使用用户自己定义的函数,而该函数与调用它的函数(即主调函数)不在同一文件中,或者函数定义的位置在主调函数之后,则必须在调用此函数之前对被调用的函数作声明。

示例:

#include<stdio.h> int fun(int x); int main() { printf("%d", fun(3)); return 0; } int fun(int x) { return x * x; }

运行结果如下图所示:

由此我们可以知道,函数的声明就是将函数的返回值类型,函数名,参数 放在调用函数时的上面,换句话说就是告诉编译器有这么一个函数。

注:一个函数只能定义一次,但是可以多次声明。

6).函数的嵌套调用:

顾名思义,就是在一个函数中再次调用函数,这个函数可以是函数本身的也可以是其他函数。

当函数自己调用自己时,也被称为函数递归

示例1:

#include<stdio.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:

#include<stdio.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).函数的链式访问:

简单来说,函数的链式访问就是把一个函数的返回值作为另外一个函数的参数。

示例:

#include<stdio.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的结果。

四.传值调用和传址调用:

传值调用:在函数调用过程中,传值调用将实参的数据(而不是地址)传给了形参,
在被调用的函数中,形参值改变了,但是不影响主调函数的实参值。
参数传递方向是由实参向形参单向传递。

示例:

#include<stdio.h> int fun(int a) { a++; printf("%d\n", a); return a; } int main() { int a = 5; fun(a); printf("%d", a); return 0; }

运行结果如下图所示:

易知,传值调用时,对形参的改变不影响实参。

传址调用:传址调用与传值调用不同,传址调用是将实参变量的地址传给形参,(此时形参是指针,即让形参的指针指向实参地址)改变形参的同时也把实参改变了。

#include<stdio.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 的值发生了改变。

函数参数调用归根揭底就是创建一个新的变量(形式参数),将实际参数的内容复制到新变量中,这里我们改变新变量的值和实际参数毫无关系,但是传址调用,通过地址可以找到存放数据的地方,这时候改变数据就是改变实际参数。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 13:02:32

LeetCode热题100刷题指南:高频考点与三轮高效刷题计划

聊 LeetCode 热题 100 之前&#xff0c;先说个我自己的经历。去年带一个学弟准备暑期实习&#xff0c;他算法底子一般&#xff0c;每天刷题刷得挺猛&#xff0c;但刷到第三周反而焦虑了——题量上去了一百多道&#xff0c;可一合上题解&#xff0c;脑子里还是空的。我给他的建议…

作者头像 李华
网站建设 2026/9/28 13:01:15

Crystools报NVML not found?GPU监控断链的根源与修复

1. 这不是玄学&#xff0c;是GPU监控的底层逻辑断层你刚装好ComfyUI秋叶一键整合包&#xff0c;打开Crystools插件&#xff0c;界面一片灰——左下角弹出红色报错&#xff1a;“NVML not found”&#xff0c;或者更具体一点&#xff1a;“pynvml.NVMLError_LibraryNotFound: NV…

作者头像 李华
网站建设 2026/9/28 13:00:45

Python实现幻影围棋AI:不完全信息博弈与蒙特卡洛树搜索实战

简介&#xff1a;Ghost-master是基于Minigo的幻影围棋项目&#xff0c;面向围棋AI爱好者与Python开发者&#xff0c;完整实现人机对弈与AI自对弈功能。项目融合卷积神经网络与蒙特卡洛树搜索&#xff0c;通过自我对局持续优化落子策略&#xff0c;无需依赖大规模训练数据即可高…

作者头像 李华
网站建设 2026/9/28 13:00:14

pixi global uninstall 命令完全指南:卸载全局环境与底层实现剖析

开发工具CLI包管理器任务调度 【免费下载链接】pixi Powerful system-level package manager for Linux, macOS and Windows written in Rust – building on top of the Conda ecosystem. 项目地址&#xff1a; https://gitcode.com/gh_mirrors/pi/pixi 点击查看 免费下载 导…

作者头像 李华
网站建设 2026/9/28 12:59:58

pixi:Windows上Python环境管理的新利器,替代conda与venv

在Windows上折腾Python环境&#xff0c;可能是很多人的心头之痛。系统自带的Python版本老旧&#xff0c;项目A要3.9项目B要3.11&#xff0c;装个numpy还能碰上MSVC编译报错&#xff0c;卸载重装不是一次两次了。早几年大家靠conda&#xff0c;后来用venv加pip&#xff0c;但这两…

作者头像 李华