C语言教程(十):C 语言函数详解
一、引言
在 C 语言中,函数是一组执行特定任务的代码块。通过将复杂的程序逻辑划分为多个函数,不仅能提高代码的可读性、可维护性,还便于代码的复用。无论是简单的数学计算,还是复杂的系统操作,函数都发挥着核心作用。掌握函数的使用方法,是提升 C 语言编程能力的重要环节。
二、函数的定义
2.1 基本语法:
返回值类型 函数名(参数列表) { // 函数体 语句; return 返回值; } |
返回值类型:指定函数执行完成后返回的数据类型,若函数无需返回值,使用void。
函数名:遵循标识符命名规则,用于唯一标识函数。
参数列表:可以包含零个或多个参数声明,参数之间用逗号分隔,若没有参数,使用void或留空。
函数体:由一系列语句组成,是函数执行的具体逻辑。
return 语句:用于终止函数执行,并将返回值传递给调用者。若无返回值,return语句可省略。
2.2 示例:
计算两个整数之和的函数:
int add(int a, int b) {int sum = a + b;return sum;
}
此函数add接收两个int类型参数a和b,计算它们的和并返回。
三、函数的声明
3.1 声明的作用:
函数声明告知编译器函数的名称、返回值类型和参数类型,使编译器在编译时能够对函数调用进行合法性检查。函数声明通常放在调用函数的代码之前。
3.2 语法:
返回值类型 函数名(参数列表); |
声明与定义类似,但函数声明末尾需加分号,且函数体部分省略。例如,上述add函数的声明为:
int add(int a, int b);
3.3 声明的位置:
全局声明:在所有函数外部声明,作用域为整个源文件,可被文件内所有函数调用。
局部声明:在函数内部声明,作用域仅限于该函数内部。一般用于在函数内部调用其他自定义函数时,确保编译器知晓被调用函数的信息。
四、函数的调用
4.1 调用方式:
通过函数名后跟一对圆括号来调用函数,若函数有参数,在括号内传入相应参数值。例如调用上述add函数:
int result = add(3, 5);
此语句将调用add函数,传入参数 3 和 5,函数返回值赋给result变量。
4.2 函数调用过程:
参数传递:将实际参数的值复制给函数定义中的形式参数。
执行函数体:按照函数体中的语句顺序执行代码。
返回值处理:遇到return语句时,函数终止执行,将返回值传递给调用处,继续执行调用函数后的代码。
五、函数参数
5.1 形式参数与实际参数:
形式参数:函数定义中参数列表里的参数,在函数被调用前并不占用实际内存空间,只有在函数调用时才被分配内存并接收实际参数的值。
实际参数:函数调用时传递给函数的表达式、变量或常量。例如在add(3, 5)中,3 和 5 就是实际参数。
5.2 参数传递方式:
值传递:C 语言默认的参数传递方式。实际参数的值被复制到形式参数中,函数内部对形式参数的修改不会影响实际参数。例如:
void modify(int num) {num = num * 2;
}
int main() {int value = 5;modify(value);// value 仍为 5,未被修改return 0;
}
指针传递:通过传递变量的地址来实现。函数内部可通过指针修改所指向的实际变量的值。例如:
void modify(int *ptr) {*ptr = *ptr * 2;
}
int main() {int value = 5;modify(&value);// value 变为 10,已被修改return 0;
}
5.3 可变参数:
C 语言允许函数接受可变数量的参数,通过<stdarg.h>头文件中的宏来实现。例如printf函数就是典型的可变参数函数。
#include <stdarg.h>
#include <stdio.h>
int sum(int count, ...) {va_list args;va_start(args, count);int result = 0;for (int i = 0; i < count; i++) {result += va_arg(args, int);}va_end(args);return result;
}
int main() {int total = sum(3, 1, 2, 3);// total 为 6return 0;
}
上述sum函数可接受任意数量的整数参数,并计算它们的和。
六、函数的返回值
6.1 返回值类型:
函数的返回值类型在函数定义和声明时指定。返回值类型必须与return语句后表达式的类型兼容。若不兼容,编译器会进行类型转换。例如:
double divide(int a, int b) {return (double)a / b;
}
该函数将两个整数相除,并返回double类型的结果。
6.2 无返回值函数:
若函数无需返回值,使用void作为返回值类型。例如:
void printMessage() {printf("Hello, World!\n");
}
此类函数执行完函数体后,直接返回调用处,无需return语句。若使用return,其后不能有返回值表达式。
七、函数指针
7.1 定义与使用:
函数指针是指向函数的指针变量。通过函数指针可以调用函数,常用于实现回调函数等功能。
// 定义函数指针类型
typedef int (*FuncPtr)(int, int);
int add(int a, int b) {return a + b;
}
int main() {FuncPtr ptr = add;int result = ptr(3, 5);// result 为 8return 0;
}
上述代码中,FuncPtr是一个指向返回值为int,接受两个int类型参数的函数指针类型。通过FuncPtr定义指针变量ptr,并使其指向add函数,然后通过ptr调用add函数。
7.2 函数指针作为参数:
函数指针可作为其他函数的参数,用于将一个函数的行为传递给另一个函数。例如:
int operate(int a, int b, int (*func)(int, int)) {return func(a, b);
}
int add(int a, int b) {return a + b;
}
int subtract(int a, int b) {return a - b;
}
int main() {int result1 = operate(5, 3, add);int result2 = operate(5, 3, subtract);// result1 为 8,result2 为 2return 0;
}
operate函数接受两个整数和一个函数指针作为参数,通过函数指针调用不同的函数进行计算。
八、递归函数
8.1 递归的概念:
递归函数是指在函数内部调用自身的函数。递归通常用于解决可以分解为更小、相似问题的场景。递归函数必须有终止条件,否则会导致无限递归,最终耗尽系统资源。
8.2 示例:
计算阶乘的递归函数:
int factorial(int n) {if (n == 0 || n == 1) {return 1;} else {return n * factorial(n - 1);}
}
当n为 0 或 1 时,函数返回 1 作为终止条件;否则,通过递归调用factorial(n - 1)计算n的阶乘。
九、函数的作用域与存储类
9.1 作用域:
函数的作用域从函数定义处开始,到文件末尾结束。函数内部定义的变量为局部变量,作用域仅限于函数内部;在函数外部定义的变量为全局变量,作用域为整个源文件。若在函数内部定义了与全局变量同名的局部变量,在函数内部局部变量会覆盖全局变量。
9.2 存储类:
自动存储类(auto):函数内定义的局部变量默认是自动存储类,存储在栈中,函数执行结束时,变量所占用的内存被释放。
静态存储类(static):若将局部变量声明为static,其生命周期会延长至程序结束,且在函数多次调用间保持值不变。静态局部变量存储在静态存储区。例如:
void increment() {static int count = 0;count++;printf("Count: %d\n", count);
}
每次调用increment函数,count的值都会递增并保留。
相关文章:
C语言教程(十):C 语言函数详解
一、引言 在 C 语言中,函数是一组执行特定任务的代码块。通过将复杂的程序逻辑划分为多个函数,不仅能提高代码的可读性、可维护性,还便于代码的复用。无论是简单的数学计算,还是复杂的系统操作,函数都发挥着核心作用。…...
力扣刷题-热题100题-第35题(c++、python)
146. LRU 缓存 - 力扣(LeetCode)https://leetcode.cn/problems/lru-cache/?envTypestudy-plan-v2&envIdtop-100-liked 双向链表哈希表 内置函数 对于c有list可以充当双向链表,unordered_map充当哈希表;python有OrderedDic…...
LeetCode算法题(Go语言实现)_52
题目 给你一个下标从 0 开始的整数数组 costs ,其中 costs[i] 是雇佣第 i 位工人的代价。 同时给你两个整数 k 和 candidates 。我们想根据以下规则恰好雇佣 k 位工人: 总共进行 k 轮雇佣,且每一轮恰好雇佣一位工人。 在每一轮雇佣中…...
基于尚硅谷FreeRTOS视频笔记——13—HAL库和RTOS时钟源问题
RTOS的时钟源就是系统定时器中断,通俗来说就是系统定时器每中断一次,就扫描一次RTOS,查看RTOS中有没有任务的切换。 但是,系统存在一个HAL_Delay()函数,就是使用的系统定时器中断来执行的函数。 当我们在RTOS中&…...
FPGA入门学习Day1——设计一个DDS信号发生器
目录 一、DDS简介 (一)基本原理 (二)主要优势 (三)与传统技术的对比 二、FPGA存储器 (一)ROM波形存储器 (二)RAM随机存取存储器 (三&…...
JavaScript-立即执行函数(Immediately Invoked Function Expression,IIFE)
立即执行函数(Immediately Invoked Function Expression,IIFE)是 JavaScript 里一种很独特的函数,它在定义后会马上执行。下面会详细介绍它的语法、用途、优点以及注意事项。 一、语法 立即执行函数一般有两种常见的语法形式&am…...
【Leetcode 每日一题 - 补卡】2537. 统计好子数组的数目
问题背景 给你一个整数数组 n u m s nums nums 和一个整数 k k k,请你返回 n u m s nums nums 中 好 子数组的数目。 一个子数组 a r r arr arr 如果有 至少 k k k 对下标 ( i , j ) (i, j) (i,j) 满足 i < j i < j i<j 且 a r r [ i ] a r r [ …...
【工具-Krillin AI】视频翻译、配音、语音克隆于一体的一站式视频多语言转换工具~
Krillin AI 是全能型音视频本地化与增强解决工具。这款简约而强大的工具,集音视频翻译、配音、语音克隆于一身,支持横竖屏格式输出,确保在所有主流平台(哔哩哔哩,小红书,抖音,视频号,…...
常用绑定事件方式有哪几种
绑定事件分为3种: 1、内联模式:将函数名直接作为标签属性的属性值(注意:这里是带括号的,不带括号不生效,但是在vue中可以加括号也可以不加括号,如果需要穿参数就加括号,不需要传参数可以不加&am…...
数据结构之BFS广度优先算法(腐烂的苹果)
队列这个数据结构在很多场景下都有使用,比如在实现二叉树的层序遍历,floodfill问题(等等未完成)中,都需要借助队列的先进先出特性,下面给出这几个问题的解法 经典的二叉树的层序遍历 算法图示,以下图所示的二叉树为例…...
linux 学习 1.开始学习
准备学习linux记录一下学习内容,只会包含必要的知识,和部分演示 我采用的系统是Ubuntu24.04 初始掌握 学习首先需要掌握如何查看帮助手册 man man # man 加任何命令可以看具体命令的帮助手册 man mkdir进入手册按 d(down):往下翻半页u(u…...
Flink-01学习 介绍Flink及上手小项目之词频统计
flink简介 官网 概述: 学习Flink具体包括四个关键概念:流数据的持续处理,事件时间,有状态流处理和状态快照。 Apache Flink 是一个开源的流处理框架,旨在处理批处理和实时数据处理,具有高吞吐量和低延迟的…...
【Linux我做主】探秘gcc/g++和动静态库
TOC Linux编译器gcc/g的使用 github地址 有梦想的电信狗 前言 在软件开发的世界中,编译器如同匠人的工具,将人类可读的代码转化为机器执行的指令。 对于Linux开发者而言,gcc和g是构建C/C程序的核心工具链,掌握它们的原理和使…...
工控系统前端设计(pyqt)
题目源自:白月黑羽的项目实战四-[工控系统前端] 代码已上传至gitcode https://gitcode.com/m0_37662818/Industrial_Control_System_Front_End 心得体会:直接用组态软件或者js吧 项目亮点 tablemodel的使用,绑定了表格和数据风机自定义ite…...
一台 Master 多节点玩转 Kubernetes:sealos 一键部署实践
文章目录 一台 Master 多节点玩转 Kubernetes:sealos 一键部署实践🔗 参考链接🌐 部署环境📦 安装包说明🔧 前期准备🚀 使用 sealos 安装 Kubernetes✅ 验证集群状态📌 后续可做的优化和拓展&am…...
写书的三驾马车
2019年8月19日23:52:28 先亮出我们的兵器组合: GitBook Git Markdown,享受行云流水一般的写作 个人秀 GitBook : 一个基于 Node.js 的文档格式转换工具,支持 Markdown 和 AsciiDoc 两种语法格式,可以输出 HTML、PDF等格式的…...
科学护理进行性核上性麻痹,缓解病痛提升生活质量
进行性核上性麻痹是一种罕见的神经系统变性疾病,患者常出现姿势平衡障碍、吞咽困难、眼球运动异常等症状。通过科学的健康护理,能在一定程度上减轻患者痛苦,提升生活质量。 日常护理,保障安全舒适 患者日常活动时,需确…...
第七章:7.2求方程a*x*x+b*x+c=0的根,用3个函数,分别求当:b*b-4*a*c大于0、等于0和小于0时的根并输出结果。从主函数输入a、b、c的值
//求方程a*x*xb*xc0的根,用3个函数,分别求当:b*b-4*a*c大于0、等于0和小于0时的根并输出结果。 //从主函数输入a、b、c的值 #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<math.h> void s1(float a, float b, fl…...
优选算法系列(7.BFS 解决最短路问题)
简介: 先走到A,之后弹出A再把A能走到的地方加进去向外扩展把队列里面的元素(B,C)弹出来,再把B,C能到的地方入队列 一直这样那么最短路程就是扩展的层数。 迷宫中离入口最近的出口(me…...
实现定时发送邮件,以及时间同步
定时发送邮件 部署邮件服务 查看有没有安装mailx,安装了 [root192 ~]# rpm -q mailx mailx-12.5-43.fc38.x86_64去网易拿一下授权码,写到配置文件里 vim /etc/mail.rcset fromxxxxxxx163.com set smtpsmtp.163.com set smtp-auth-userxxxxxxx163.com set smtp-auth-passwor…...
Java反射知识点学习笔记
目录 一、定义 二、获取class对象的三种方式 1、Class.forName("全类名") 2、类名.class 3、对象.getClass() 三、案例 1、获取 class 反射对象三种方式 2、利用反射获取构造方法 3、利用反射获取成员变量 4、利用反射获取成员方法 Java反射是一种强大的编…...
Unity ShaderLab引用HLSL文件找不到其中函数
在写Unity Shader的过程中,常常需要将方法封装到HLSL文件中,今天遇到一个这样的报错, 明明hlsl文件路径引用没问题,却引用不到方法 并且将分散文件中的函数复制过来一切正常,最终定位到HLSL的预编译指令中 这指令的…...
【文献笔记】LLM-based control code generation using image recognition
LLM-based control code generation using image recognition 原文代码 标题翻译:基于图像识别的LLM控制代码生成 1. 内容介绍 1.1. 简介 论文提出了一种基于LLM的新方法,通过图像识别从管道仪表图(Piping and Instrumentation Diagrams,…...
算法之贪心算法
贪心算法 贪心算法核心思想常见应用场景典型案例案例一:找零问题案例二:活动选择问题案例三:货仓选址问题 贪心算法的应用详解霍夫曼编码最小生成树Dijkstra最短路径算法 总结 贪心算法 核心思想 贪心算法(Greedy Algorithm&…...
从“链主”到“全链”:供应链数字化转型的底层逻辑
1. 制造业与供应链数字化转型的必然性 1.1. 核心概念与战略重要性 制造业的数字化转型,是利用新一代数字技术(如工业互联网、人工智能、大数据、云计算、边缘计算等)对制造业的整体价值链进行根本性重塑的过程。这不仅涉及技术的应用&#…...
【Windows本地部署n8n工作流自动平台结合内网穿透远程在线访问】
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
Python中如何加密/解密敏感信息(如用户密码、token)
敏感信息,如用户密码、API密钥、访问令牌(token)、信用卡号以及其他个人身份信息(PII),构成了现代应用程序和系统中最为关键的部分。这些信息一旦被未经授权的第三方获取,可能引发灾难性的后果,从个人隐私泄露到企业经济损失,甚至是大规模的社会安全问题。保护这些敏感…...
Win10如何一键切换IP地址教程
切换IP地址可能对于许多用户来说是一个相对陌生但又可能经常需要进行的操作。无论是出于网络安全、突破网络限制还是仅仅为了测试目的,一键切换IP地址都能带来极大的便利。以下是在 Windows 10 中通过批处理脚本实现一键切换 IP 地址的详细教程: 方法一&…...
2021-11-09 C++三位数平方含有该数
缘由求解,运算函数,哪位大神教一下-编程语言-CSDN问答 void 三位数平方含有该数() {//缘由https://ask.csdn.net/questions/7560152?spm1005.2025.3001.5141int a 100, aa 1000, f 0;while (a < aa){f a*a;while (f > a)if ((f - a) % aa)f …...
高效检测书签网址,告别无效链接烦恼
软件介绍 你是否有过面对浏览器中满满的书签,却不知道哪些网址还“健在”,哪些已经“跑路”的烦恼?别担心,今天就给大家介绍一款神奇的小工具——“网址小卫士”。 检测轻松搞定 还在一个个手动检查书签网址的有效性吗…...
SpringBoot高校学生评教系统设计实现
概述 基于SpringBoot的高校学生评教系统项目,该系统包含了学生评教、教师管理等功能,适合作为JavaWeb学习项目。 主要内容 1. 学生功能模块 查看评教信息:可以查看学期、院系、任课教师、课程名称等信息评价打分功能:可以对课…...
代码随想录算法训练营第二十天
LeetCode题目: 39. 组合总和40. 组合总和 II131. 分割回文串2176. 统计数组中相等且可以被整除的数对(每日一题) 其他: 今日总结 往期打卡 39. 组合总和 跳转: 39. 组合总和 学习: 代码随想录公开讲解 问题: 给你一个 无重复元素 的整数数组 candidates 和一个目标整数 targ…...
C++入门基础:命名空间,缺省参数,函数重载,输入输出
命名空间: C语言是基于C语言的,融入了面向对象编程思想,有了很多有用的库,所以接下来我们将学习C如何优化C语言的不足的。 在C/C语言实践中,在全局作用域中变量,函数,类会有很多,这…...
GPU怎么绑定到服务器上
确认服务器与 GPU 兼容性1:不同的服务器和 GPU 型号连接方式有所不同,要确保所选的 GPU 卡与服务器兼容。可通过服务器和 GPU 的产品文档,或使用服务器厂商提供的兼容性查询工具进行确认。安装前准备:关闭服务器电源,并…...
opencv函数展示2
一、像素操作与算术运算 1.cv2.split() 2. cv2.merge() 3.cv2.add() 4.cv2.bitwise_and() 5.cv2.bitwise_or() 6.cv2.inRange() 二、仿射变换 1.cv2.getRotationMatrix2D() 2.cv2.warpAffine() 3.cv2.flip() 4.cv2.resize() 三、透视变换 1.cv2.getPerspectiveTransform() 2…...
零基础上手Python数据分析 (16):DataFrame 常用统计分析方法
写在前面 —— 超越简单排序,探索数据内在规律,掌握Pandas统计分析基础 上一篇博客,我们学习了如何使用 Pandas 对 DataFrame 进行排序和排名,这使得我们能够更好地组织数据并快速定位关键信息。 然而,仅仅对数据进行排序和排名,还不足以完全理解数据。 要想更深入地解…...
文件系统 软硬连接
🌻个人主页:路飞雪吖~ 🌠专栏:Linux 目录 一、理解文件系统 🌠磁盘结构 二、软硬连接 🌟软硬链接 🌠软链接: 🌠硬链接: 🌟理解软硬链接的应…...
Linux环境基础开发工具使用
本节目标: 1. 学习yum工具,进行软件安装 2. 掌握vim编辑器使用,学会vim的简单配置 3. 掌握gcc/g编译器的使用,并了解其过程,原理 4. 掌握简单gdb使用于调试 5. 掌握简单的Makefile编写,了解其运行思想…...
秘密任务 2.0:如何利用 WebSockets + DTOs 设计实时操作
在之前的文章中,我们探讨了为什么 DTO 是提升 API 效率和安全性的秘密武器。现在,我们进入了一个全新的场景——我们将深入探讨如何通过 WebSockets DTOs 实现实时操作! Agent X 正在进行一项高风险的卧底任务。突然,总部更新了…...
LeetCode hot 100—括号生成
题目 数字 n 代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例 示例 1: 输入:n 3 输出:["((()))","(()())","(())()","()(())",&…...
2025.04.17【Dendrogram】生信数据可视化:Dendrogram图表详解
Dendrogram customization Go further with ggraph: edge style, general layout, node features, adding labels, and more. Customized circular dendrogram Learn how to build a circular dendrogram with proper labels. 文章目录 Dendrogram customizationCustomized c…...
SDL基础
SDL SDL(Simple DirectMedia Layer)是一个开源的跨平台多媒体开发库,主要用于开发需要图形、音频和输入设备支持的应用程序。它使用C语言编写,提供了简单易用的API,**能够帮助开发者快速实现跨平台的多媒体功能。**SD…...
硬件工程师面试常见问题(2)
第六问:你知道那些常用逻辑电平?TTL与COMS电平可以直接互连吗? 逻辑电平:是数字电路中用于表示二进制逻辑状态(0 和 1)的电压或电流信号范围,是数字系统中器件间信号传输的统一标准。 注:逻辑电…...
Python自学第2天:条件语句,循环语句
条件语句 1.条件判断 score 60 if score > 90:print("优秀") elif score > 60:print("及格") else:print("不及格") 注意: 1、每个条件后面要使用冒号 :,表示接下来是满足条件后要执行的语句块。2、使用缩进来划…...
2025年4月16日华为笔试第一题100分
📌 点击直达笔试专栏 👉《大厂笔试突围》 💻 春秋招笔试突围在线OJ 👉 笔试突围OJ 01. 博物馆展览规划 问题描述 卢小姐是一家著名博物馆的策展人,她需要从众多展品中选择一些组成新的展览。每件展品可以展示不同的历史文化主题,而博物馆希望通过最少的展品数量覆…...
智能体开发的范式革命:Cangjie Magic全景解读与实践思考
引言:当智能体开发遇见仓颉魔法 在人工智能技术日新月异的今天,智能体(Agent)开发正从实验室走向产业应用的核心舞台。2025年3月,仓颉社区推出的Cangjie Magic开源平台,以其创新的设计理念和技术架构,为这一领域带来了…...
LeetCode hot 100—单词搜索
题目 给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或…...
基于flask+vue框架的灯饰安装维修系统u49cf(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
系统程序文件列表 项目功能:用户,工单人员,服务项目,订单记录,服务记录,评价记录 开题报告内容 基于 FlaskVue 框架的灯饰安装维修系统开题报告 一、选题背景与意义 (一)选题背景 随着城市化进程的加速与居民生活品质的显著提升…...
C/C++指针
为什么要使用指针 函数的值传递,无法通过调用函数,来修改函数的实参;被调用函数需要提供更多的“返回值”给调用函数;减少值传递时带来的额外开销,提高代码执行效率 指针定义:指针是什么 int age18; /* …...
Unity编辑器扩展之项目资源查找工具
一、需要实现的效果如下: 二、在项目的Asset目录下新增Editor目录,新增AssetSearchWindow和EditorDefine和EditorTools这三个C#脚本,并复制以下的代码保存好之后,就可以实现上述功能啦。 -------------------------------------------EditorTools脚本Begin----------------…...