【C语言零基础入门篇 - 7】:拆解函数的奥秘:定义、声明、变量,传递须知,嵌套玩转,递归惊艳
文章目录
- 函数
- 函数的定义与声明
- 局部变量和全局变量、静态变量
- 静态变量和动态变量
- 函数的值传递
- 函数参数的地址传值
- 函数的嵌套使用
- 函数的递归调用
函数
函数的定义与声明
函数的概念:函数是C语言项目的基本组成单位。实现一个功能可以封装一个函数来实现。定义函数的时候一切以功能为目的,根据功能去定函数的参数和返回值。
函数的定义
函数定义的格式:函数的返回值类型 函数名(形参列表)
{代码块;}
注意:
- 函数的返回值类型,可以是学过的int、char、float、double以及void,还可以是以后要学习的类型;它的作用:表示函数执行完之后,可以得到一个什么类型的值。
- return 返回出一个具体值(void类型的返回值可以没有return)。
- 函数名:标识符(符合用户自定义标识符)、见名知意
- 有指定参数时,要指定参数的类型、名字;参数可以是一个、多个,也可以没有。
- 不能在定义函数时,在函数首部小括号后直接跟分号。
- 指定函数所完成的功能,也就是规定函数要完成什么操作, 函数是做什么。
- 函数体可以没有语句,但不能没有花括号。
- 在定义函数的里面,不能再定义一个函数。
- 例1:定义一个打印九九乘法表的函数并调用
#include<stdio.h>//定义一个函数,打印一个九九乘法表
void printMul() //void 定义一个返回值为空的函数
{for (int i = 1; i <= 9; i++){for (int j = 1; j <= i; j++){printf("%dx%d=%d\t", j, i, i*j);}printf("\n");}
}
int main()
{printMul();return 0;
}

注意:当main函数写在调用的函数之前时,程序运行会报错。因为程序是从上到下运行,当运行到main函数中时找不到你所调用的printMul()函数,则会报错。这时,我们可以进行函数声明来解决这个问题。
函数声明语句的一般格式:
函数类型 函数名(参数类型1 参数名1,参数类型2 参数名2,……);
也就是相当于把函数头前置
#include<stdio.h>void printMul(); //函数的返回值类型 函数名(形参列表);int main()
{printMul();return 0;
}//定义一个函数,打印一个九九乘法表
void printMul() //void 定义一个返回值为空的函数
{.....
}
- 例2:函数的返回值类型说明,函数的返回值类型必须跟函数类型一致,否则就会出现错误。例如我想定义一个返回值为整型的函数

- 若返回值为双精度浮点型,则会出现数据丢失,因为只返回整型数据

局部变量和全局变量、静态变量
什么是局部变量 ?
局部变量是在函数中定义的普通变量(没有任何的修饰),以及在函数开头定义的形参。
局部变量的作用范围:从定义开始,往下的作用域;出了作用域就不能使用。函数开头定义的变量,在该函数范围内有效。

什么是全局变量?
全局变量:函数外或全局空间定义的变量
全局变量的作用范围:从定义开始往下,在本文件内所有的地方都可以使用。
全局变量在程序结束的时候,会被释放。
#include<stdio.h>
int a = 10; //定义一个全局变量void func1()
{int a = 30;printf("func1函数中:a=%d\n", a);
}void func2()
{printf("func3函数中:a=%d\n", a);
}int main()
{func1();func2();return 0;
}

静态变量和动态变量
程序中所定义的变量默认是动态局部变量(auto)。
在定义变量前加一个static可定义一个静态局部变量。
静态变量在程序开始后定义,结束前才会被释放,所以其生命周期比较长,在函数调用中只会被定义一次,不会被定义多次,当再次执行到定义语句时,其值不会被重置(初始化),会保留上次改变的值。
void func2()
{static int c = 10; //静态变量 c会被锁住,让c不会被释放int b = 10;b++; c++;printf("b=%d\tc=%d\n", b, c);
}int main(void) //有void表示不会有任何实参传过来,如果有就会报错
{for (int i = 0; i < 3; i++){func2();}return 0;
}

函数的值传递
注意:形参不会改变实参的值,实参传值给形参,值是一个单向传递。

函数参数的地址传值
fun函数的形参是如何接收传输数据——地址?
(1)先得到数据的地址,然后传给函数。
(2)访问定义函数的里的这个地址的值
如何定义一个接收地址的变量?
能存地址的变量:指针变量
指针变量的定义: 数据类型 *指针名
数据类型:用指针存的什么类型的地址
指针名:符合标识符命名规则和命名规范
* —— 取值运算符、解引用;通过地址做解引用找到值

函数的嵌套使用
函数的定义时相互平行、独立的,在定义函数时,一个函数内不能再定义另一个函数,也就是说,函数不能嵌套定义。
但是函数可以嵌套调用,也就是再调用一个函数的过程中,又调用另一个函数。

函数的递归调用
函数的递归:在一个函数中,函数重复的调用自己。
在函数调用的时候,函数会入栈。

- 注意以上结果,当我们调换两个语句时,会有不一样的结果

过程分析

- 函数递归调用经典例子:斐波那契数列
斐波那契数列(Fibonacci sequence),又称黄金分割数列,因数学家莱昂纳多·斐波那契(Leonardo Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,指的是这样一个数列:1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)在现代物理、准晶体结构、化学等领域,斐波那契数列都有直接的应用,为此,美国数学会从 1963 年起出版了以《斐波那契数列季刊》为名的一份数学杂志,用于专门刊载这方面的研究成果。
int func5(int n)
{if (n > 2){return func5(n - 1) + func5(n - 2);}else if (n == 1 || n == 2){return 1;}
}int main(void) //有void表示不会有任何实参传过来,如果有就会报错
{printf("%d\n", func5(4));return 0;
}

相关文章:
【C语言零基础入门篇 - 7】:拆解函数的奥秘:定义、声明、变量,传递须知,嵌套玩转,递归惊艳
文章目录 函数函数的定义与声明局部变量和全局变量、静态变量静态变量和动态变量函数的值传递函数参数的地址传值 函数的嵌套使用函数的递归调用 函数 函数的定义与声明 函数的概念:函数是C语言项目的基本组成单位。实现一个功能可以封装一个函数来实现。定义函数的…...
ClickHouse在AI领域的结合应用
文章目录 引言1.1 人工智能与大数据的融合1.2 ClickHouse在大数据平台中的地位2.1 BI与AI的融合从传统BI到智能BIAI赋能BI融合的优势实际应用案例 2.2 异构数据处理的重要性数据多样性的挑战异构数据处理的需求技术实现实际应用案例 2.3 向量检索与AIOps技术向量检索的背景AIOp…...
git push出错Push cannot contain secrets
报错原因: 因为你的代码里面包含了github token明文信息,github担心你的token会泄漏,所以就不允许你推送这些内容。 解决办法: 需要先把代码里面的github token信息删除掉,并且删掉之前的历史提交,只要包…...
OpenAI 的最强模型 o1 的“护城河”失守?谷歌 DeepMind 早已揭示相同原理
发布不到一周,OpenAI 的最新模型 o1 的“护城河”似乎已经失守。 近日,有人发现谷歌 DeepMind 早在今年 8 月发表的一篇论文,揭示了与 o1 模型极其相似的工作原理。 这项研究指出,在模型推理过程中增加测试时的计算量,…...
【胡乱念叨】大模型的“我”
下面的内容很有可能事实错误,胡说八道,前后不连贯,举例随意且未经考证 甚至 有意欺骗!嘻嘻。所以是【胡乱念叨】 文章目录 【胡乱念叨】大模型的“我”参数量和“我”什么是“我”从输入输出的观点看“我”大模型的“我”乱讨论 …...
Flag_AGtivity_clear_top网页编程指南如何退出多activity程序
activity的启动模式:FLAG_ACTIVITY_CLEAR_TOP和FLAG_ACTIVITY_REORDER_TO_FRONT。 1. 如果已经启动了四个Activity:A,B,C和D。在D Activity里,我们要跳到B Activity,同时希望C finish掉,可以在start…...
克隆centos网卡uuid相同如何修改
在克隆CentOS系统后,网卡的UUID相同会导致网络配置冲突,使得网络无法正常工作。要解决这个问题,你需要为每个克隆的系统生成新的UUID。 以下是解决步骤: 进入原始CentOS系统。 找到网络配置文件的位置,通常在 /etc/s…...
C语言习题~day11
1、C程序常见的错误分类不包含:( ) A.编译错误 B.链接错误 C.栈溢出 D.运行时错误 栈溢出是运行时错误的一种,因此C程序不会将栈溢出错误单独列出来,栈溢出包含在运行时错误中。 因此:选择C 2、关于VS调…...
Ansible——Playbook基本功能???
文章目录 一、Ansible Playbook介绍1、Playbook的简单组成1)“play”2)“task”3)“playbook” 2、Playbook与ad-hoc简单对比区别联系 3、YAML文件语法:---以及多个---??使用 include 指令 1. 基本结构2. 数…...
多线程学习篇一:启动多线程的三种方式
1. 继承 Thread 类 Slf4j public class MyThread extends Thread {Overridepublic void run() {log.info("MyThread run ...");}public static void main(String[] args) {MyThread myThread new MyThread();myThread.start();} } 2. 实现 Runnable 接口 Slf4j pu…...
【专题】2024跨境出海供应链洞察-更先进供应链报告合集PDF分享(附原数据表)
原文链接:https://tecdat.cn/?p37665 当前,全球化商业浪潮促使跨境电商行业飞速发展,产业带与跨境电商接轨、平台半托管模式涌现、社交电商带来红利机会以及海外仓不断扩张,这使得产业带外贸工厂、内贸工厂、传统进出口企业和品…...
git submodule
git submodule 是 Git 提供的一种功能,用于在一个 Git 仓库中嵌套另一个 Git 仓库。它可以帮助管理和跟踪外部项目或依赖项,特别是在以下场景中非常有用: 1. 管理外部依赖 当你的项目依赖于其他外部项目或库时,可以使用 git sub…...
【Power Compiler手册】13.UPF多电压设计实现(3)
创建供电端口 要创建电源和地端口,请使用`create_supply_port`命令。 供电端口的名称应该是一个简单的(非层次化的)名称,并且在其定义的层次级别上是唯一的。除非指定了`-domain`选项,否则端口是在当前作用域或层次级别创建的,当前作用域中的所有电源域都可以使用创建的…...
RTX 4090 系列即将停产,RTX 5090 系列蓄势待发
据最新消息,英伟达将于今年10月正式终结其GeForce RTX 4090及RTX 4090D两款旗舰级显卡的生产线。根据行业媒体报道,英伟达及其合作厂商将从下个月开始全面停止这两款显卡的制造。 自2022年10月问世以来,GeForce RTX 4090凭借其无与伦比的GPU…...
【MySQL】使用C语言连接数据库
看到标题,可能会疑惑,我们学习的不是C吗,为什么使用C语言去连接数据库呢??实际上,这两种语言都可以连接数据库,但是C语言提供的API没有进行封装,更有利于我们学习数据库连接。面向API编程,哈哈…...
Vue学习记录之四(watch侦听器和watchEffect高级侦听器)
watch watch 用于侦听特定的响应式数据源(如数据、计算属性等),比如ref或者是reactive时,并在其变化时执行回调函数。它适合用于处理副作用,如 API 请求或异步操作。使用 watch 适合特定数据变化的侦听,提…...
RedisTemplate操作ZSet的API
文章目录 ⛄概述⛄常见命令有⛄RedisTemplate API❄️❄️ 向集合中插入元素,并设置分数❄️❄️向集合中插入多个元素,并设置分数❄️❄️按照排名先后(从小到大)打印指定区间内的元素, -1为打印全部❄️❄️获得指定元素的分数❄️❄️返回集合内的成员个数❄️❄…...
Android 15 正式发布至 AOSP
Google官方宣布,将于近期发布了 Android 15,而在早些时候,Google已经将其源代码推送至 Android 开源项目 (AOSP)。未来几周内,Android 15 将在受支持的 Pixel 设备上正式推出,并将于今年晚些时候在三星、Honor、iQOO、…...
IEEE Electronic Library(IEL)数据库文献检索下载介绍及个人获取IEEE文献途径
一、数据库介绍 IEEE(The Institute of Electrical and Electronics Engineers,电气电子工程师学会)是目前全球最大的非营利性专业技术学会,在全球160多个国家拥有超过45万名会员。IEEE在电气电子、计算机、半导体、通讯、电力能…...
动手学习RAG:大模型重排模型 bge-reranker-v2-gemma微调
动手学习RAG: 向量模型动手学习RAG: moka-ai/m3e 模型微调deepspeed与对比学习动手学习RAG:rerank模型微调实践 bge-reranker-v2-m3动手学习RAG:迟交互模型colbert微调实践 bge-m3动手学习RAG: 大模型向量模型微调 intfloat/e5-mistral-7b-instruct动手学…...
颠覆传统投资分析:TradingAgents-CN智能交易系统零门槛部署指南
颠覆传统投资分析:TradingAgents-CN智能交易系统零门槛部署指南 【免费下载链接】TradingAgents-CN 基于多智能体LLM的中文金融交易框架 - TradingAgents中文增强版 项目地址: https://gitcode.com/GitHub_Trending/tr/TradingAgents-CN 在金融科技迅猛发展的…...
3步突破显卡限制:如何让AMD/Intel显卡实现DLSS级画质?
3步突破显卡限制:如何让AMD/Intel显卡实现DLSS级画质? 【免费下载链接】OptiScaler OptiScaler bridges upscaling/frame gen across GPUs. Supports DLSS2/XeSS/FSR2 inputs, replaces native upscalers, enables FSR3 FG on non-FG titles. Supports N…...
Pixel Mind Decoder 异常情绪监测:在系统日志中定位用户不满信号
Pixel Mind Decoder 异常情绪监测:在系统日志中定位用户不满信号 1. 运维场景中的情绪危机 你有没有遇到过这种情况:系统运行一切正常,监控指标全绿,但用户满意度却在悄悄下滑?等到收到大量投诉时,问题已…...
GHelper:华硕笔记本轻量级替代方案与性能优化指南
GHelper:华硕笔记本轻量级替代方案与性能优化指南 【免费下载链接】g-helper Lightweight, open-source control tool for ASUS laptops and ROG Ally. Manage performance modes, fans, GPU, battery, and RGB lighting across Zephyrus, Flow, TUF, Strix, Scar, …...
在MATLAB中调用与可视化Lingbot-Depth-Pretrain-ViTL-14的深度估计结果
在MATLAB中调用与可视化Lingbot-Depth-Pretrain-ViTL-14的深度估计结果 对于很多从事计算机视觉、机器人或者测绘相关研究的工程师和学者来说,深度估计是一个基础又关键的任务。它能从一张普通的二维图片中,推测出每个像素点距离相机的远近,…...
从CFG到PDG:5个真实案例解析程序依赖图在安全审计中的应用
从CFG到PDG:5个真实案例解析程序依赖图在安全审计中的应用 在软件安全领域,漏洞检测的精准度往往取决于代码分析的深度。传统控制流图(CFG)虽然能描绘执行路径,却难以捕捉数据流转的潜在风险。程序依赖图(P…...
手把手教你用FUTURE POLICE:会议录音秒变带时间轴字幕
手把手教你用FUTURE POLICE:会议录音秒变带时间轴字幕 1. 为什么需要高精度字幕对齐? 在日常工作中,我们经常遇到这样的场景:重要会议录音需要整理成文字稿,但人工听写耗时耗力;视频剪辑时需要添加字幕&a…...
Windows右键菜单重构指南:从混乱到高效的ContextMenuManager实战
Windows右键菜单重构指南:从混乱到高效的ContextMenuManager实战 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager 问题诊断:你的右键菜单是…...
别再手动改配置了!用Docker Compose一键部署Pikachu靶场,5分钟搞定测试环境
5分钟极速搭建Pikachu靶场:Docker Compose自动化实战指南 每次准备网络安全练习环境时,最头疼的莫过于反复安装配置各种服务——PHP版本不兼容、MySQL连接失败、Web服务器配置错误...这些琐碎问题消耗了本应用于渗透测试学习的宝贵时间。今天要分享的这套…...
内容营销对 SEO 有什么影响
<h3 id"seo">内容营销对 SEO 有什么影响</h3> <h4 id"">引言</h4> <p>在当今数字化时代,搜索引擎优化(SEO)和内容营销被广泛认为是网站流量和业务增长的关键驱动因素。许多企业在网站建设…...
