【C语言零基础入门篇 - 7】:拆解函数的奥秘:定义、声明、变量,传递须知,嵌套玩转,递归惊艳

news2024/11/14 16:31:29

文章目录

  • 函数
    • 函数的定义与声明
    • 局部变量和全局变量、静态变量
    • 静态变量和动态变量
    • 函数的值传递
      • 函数参数的地址传值
    • 函数的嵌套使用
    • 函数的递归调用

函数


函数的定义与声明

函数的概念:函数是C语言项目的基本组成单位。实现一个功能可以封装一个函数来实现。定义函数的时候一切以功能为目的,根据功能去定函数的参数和返回值。

函数的定义

函数定义的格式:

函数的返回值类型 函数名(形参列表)
{

	代码块;

}

注意:

  1. 函数的返回值类型,可以是学过的int、char、float、double以及void,还可以是以后要学习的类型;它的作用:表示函数执行完之后,可以得到一个什么类型的值。
  2. return 返回出一个具体值(void类型的返回值可以没有return)。
  3. 函数名:标识符(符合用户自定义标识符)、见名知意
  4. 有指定参数时,要指定参数的类型、名字;参数可以是一个、多个,也可以没有。
  5. 不能在定义函数时,在函数首部小括号后直接跟分号。
  6. 指定函数所完成的功能,也就是规定函数要完成什么操作, 函数是做什么。
  7. 函数体可以没有语句,但不能没有花括号。
  8. 在定义函数的里面,不能再定义一个函数。
  • 例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;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2144590.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图片转PDF技巧揭秘:四款高效工具推荐!

在数字化办公和学习的今天&#xff0c;将图片或其他文件格式转换为PDF已成为一种常见需求。以下是几款推荐的转换工具&#xff0c;它们各自具有独特的功能和使用体验&#xff0c;可帮助大家轻松实现图片转PDF及其他PDF相关操作。 福昕PDF转换大师&#xff08;365客户端&#x…

关于 Qt运行加载内存较大崩溃添加扩大运行内存 的解决方法

若该文为原创文章&#xff0c;转载请注明原文出处 本文章博客地址&#xff1a;https://hpzwl.blog.csdn.net/article/details/142341544 长沙红胖子Qt&#xff08;长沙创微智科&#xff09;博文大全&#xff1a;开发技术集合&#xff08;包含Qt实用技术、树莓派、三维、OpenCV…

【重学 MySQL】三十三、流程控制函数

【重学 MySQL】三十三、流程控制函数 IF函数IFNULL函数CASE函数总结 在MySQL中&#xff0c;流程控制函数是用于在SQL查询、存储过程或函数中根据特定条件执行不同流程的重要工具。这些函数可以帮助我们实现复杂的逻辑判断和数据转换。 IF函数 IF函数是MySQL中最基本的流程控制…

泛微E-Mobile client/cdnfile 任意文件读取漏洞复现

0x01 产品简介 泛微E-Mobile是一款由泛微网络科技股份有限公司开发的移动办公产品,该产品专门为手机、平板电脑等移动终端用户设计,旨在提供便捷、高效的移动办公体验。适用于企业高管和有移动办公需求的业务部相关员工使用,特别适合于已有内部OA系统的大中型企业机构,尤其…

算法-排序算法(冒泡选择插入希尔快速归并堆)

1.算法概述 1.1什么是算法 算法是特定问题的求解步骤的描述&#xff0c;是独立存在的一种解决问题的思想和方法。对于算法而言计算机编程语言并不重要&#xff0c;可以用任何计算机编程语言来编写算法。 程序数据结构算法 1.2数据结构和算法的区别和联系 数据结构只是静态…

闲置物品交易系统小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;学生管理&#xff0c;卖家管理&#xff0c;广场管理&#xff0c;商品类型管理&#xff0c;商品信息管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;广场&#xff0c;商…

欧盟禁用PFAS材料!线材该如何应对?

了应对欧盟即将在2027年1月开始强制执行禁用PFAS材料的法规&#xff0c;一众线材厂商纷纷研发出了对应的替代材料&#xff0c;第二十三届华东磁性元件峰会现场&#xff0c;多家线材企业均带来了PFAS材料的替代产品。 宇盛电子 苏州宇盛电子有限公司&#xff08;下称“宇盛电子…

从Profinet到Ethernet IP网关技术重塑工业网络,数据传输更流畅

Profinet转Ethernet IP网关在未来工业领域可能产生以下重要影响并发挥关键作用&#xff1a;促进工业设备集成与互操作性&#xff1a;打破协议壁垒&#xff1a;在工业场景中&#xff0c;存在多种不同的工业以太网协议&#xff0c;设备往往因协议差异而难以直接通信。 Profinet转…

基于姿态估计的翻墙动作识别系统(姿态估计 mediapipe )

基于姿态估计的翻越动作识别系统是一个结合了计算机视觉、姿态估计技术和深度学习的项目&#xff0c;其目的是识别特定的动作&#xff0c;比如“翻越”动作。在这个项目中&#xff0c;我们使用MediaPipe姿态估计工具进行人体姿态估计&#xff0c;并结合深度学习模型来识别翻越动…

城市内涝积水监测预警系统助力智慧城市应急防汛

一、方案背景 近 20 年来&#xff0c;我国城市化进程加快&#xff0c;城市地区由于人口密集&#xff0c;物资财产密度不断加大等特点&#xff0c;高强度暴雨积水形成的洪涝灾害对城市化地区产生的威肋和带来的损失越来越大。由于城市的不断扩建&#xff0c;使工业区、商业区和居…

施耐德EcoStruxure Machine SCADA Expert(EMSE)用户管理进阶(十四)

之前简单介绍了用户管理的功能,这里详细展示要实现一套完整的用户管理功能需要做什么 如下图所示 符合GMP的用户管理功能一般可包含如下功能: 用户新建、用户密码修改、用户锁定/激活、用户删除、用户组策略配置(右下角可配置参数) 首先新建变量—结构体 1.cUser 2.cUser…

java日志框架之JUL(Logging)

文章目录 一、JUL简介1、JUL组件介绍 二、Logger快速入门三、Logger日志级别1、日志级别2、默认级别info3、原理分析4、自定义日志级别5、日志持久化&#xff08;保存到磁盘&#xff09; 三、Logger父子关系四、Logger配置文件 一、JUL简介 JUL全程Java Util Logging&#xff…

OSG开发笔记(三十):OSG加载动力学仿真K模型文件以及测试Demo

​ 若该文为原创文章&#xff0c;未经允许不得转载 本文章博客地址&#xff1a;https://blog.csdn.net/qq21497936/article/details/142340138 各位读者&#xff0c;知识无穷而人力有穷&#xff0c;要么改需求&#xff0c;要么找专业人士&#xff0c;要么自己研究 长沙红胖子Q…

地大信息-基础信息平台 GetImg 任意文件读取漏洞复现

0x01 产品简介 地大信息的基础信息平台,通过整合各类空间基础数据,包括地理、地质、气象等多源信息,构建了一个空-天-地一体化的自然灾害监测物联网和时空感知大数据平台。该平台不仅支持数据的集成、管理和共享,还提供了丰富的数据分析和应用服务,为政府决策、行业监管和…

C++对C的扩充

练习&#xff1a;提示输入字符串&#xff0c;统计字符串中空格&#xff0c;大写字母&#xff0c;小写字母&#xff0c;其他字符的个数 #include <iostream>using namespace std;int main() {cout << "请输入字符串&#xff1a;";string str;getline(cin…

[OpenCV] 数字图像处理 C++ 学习——14霍夫变换直线、圆检测 附完整代码

文章目录 前言1.霍夫变换原理(1)霍夫变换检测直线的原理(2)霍夫变换检测圆的原理 2.代码实现(1)霍夫直线检测(2)霍夫圆检测 3.完整代码 前言 霍夫变换是一种有效的检测图像中的几何形状&#xff08;如直线、圆等&#xff09;的算法。霍夫变换通过将几何形状的检测问题转化为参…

微分方程学习笔记

文章目录 一、基础概念二、重要结论1、一阶可分离变量的微分方程求解思路2、一阶非齐次线性微分方程解的结构3、可降阶的高阶微分方程4、线性微分方程解的结构1. 二阶齐次线性微分方程解的结构2. 二阶非齐次线性微分方程解的结构 参考 之前大学的时候学微分方程有点云里雾里的&…

【2024】前端学习笔记7-颜色-位置-字体设置

学习笔记 1.定义&#xff1a;css2.颜色&#xff1a;color3.字体相关属性&#xff1a;font3.1.字体大小&#xff1a;font-size3.2.字体风格&#xff1a;font - style3.3.字体粗细&#xff1a;font - weight3.4.字体族&#xff1a;font - family 4.位置&#xff1a;text-align 1.…

CMA第三方软件测试报告获取指南

在当今竞争激烈的市场环境中&#xff0c;企业对于产品质量的重视程度不断提高。为了确保软件产品的性能和安全性&#xff0c;许多企业开始寻求专业的第三方测试服务来获取第三方软件测试报告&#xff0c;而有无CMA认证资质对于软件测试报告来说至关重要。 CMA认证是中国国家认…

Web 服务器介绍 | 通过 Tomcat 说明其作用

1. 什么是 Web 服务器&#xff1f; Web服务器是一种用于存储、处理和提供网页或Web应用程序的服务器。它通过HTTP&#xff08;超文本传输协议&#xff09;与客户端&#xff08;通常是浏览器&#xff09;进行通信&#xff0c;接收客户端的请求&#xff08;如网页请求&#xff0…