【C语言】函数详解

news2025/1/4 20:16:41

       🔥🔥 欢迎来到小林的博客!!
      🛰️博客主页:✈️小林爱敲代码
      🛰️专栏:✈️C语言快速入门
      🛰️欢迎关注:👍点赞🙌收藏✍️留言
在这里插入图片描述

      这篇文章给大家介绍C语言中函数的使用,本来打算昨天为大家更新的。但是阳了,早上刚挂完点滴,就跑来更新博客了。🌺🌺

  
      每日一句: 成功不是将来才有的,而是从决定去做的那一刻起,持续积累而成。

大纲:

![

函数内容的大纲:
在这里插入图片描述

目录

  • 💖7 函数
    • 💪7.2 函数的声明和定义
      • 🔮7.2.1 函数的声明
      • 🔮7.2.2 函数的定义
    • 💪7.3 函数的调用和传参
      • 🔮7.3.1 函数的调用
      • 🔮7.3.2 函数的传参
    • 💪7.4 函数的返回值
    • 💪7.5 函数的传址调用
    • 💪7.6 函数的嵌套调用
    • 💪7.7 函数的递归
  • 结言🥳:

💖7 函数

函数有2类,一类是库函数,一类是自定义函数,库函数就是C语言为我们提供的。例如我们常用的 printf(),scanf(),这些都是C语言为我们提供的库函数。自定义函数则是我们自己定义的函数,自己定义,自己调用。

💪7.2 函数的声明和定义

🔮7.2.1 函数的声明

函数的声明定义格式为: 返回值类型 函数名(参数列表);
返回值类型:就是数据类型,如果没有返回值类型则用void。
函数名:随意,但在C语言中,函数名不能重复。
参数列表:就是传给函数的数据。

以下是函数声明的例子:

#include <stdio.h>

//一个无返回值,无参数的函数声明
void a();

//一个无返回值,有1个int参数的函数声明
void b(int a);

//有1个int类型参数和1个double类型参数 ,且有返回值为int类型的函数
int c(int a,double d);

int main()
{
	return 0;
}

函数的声明一般会放在.h的头文件中。

🔮7.2.2 函数的定义

函数声明之后,我们需要定义。定义的话就直接把声明函数展开。
函数的定义格式为: 返回值类型 函数名(参数列表) { 函数体;}

函数定义如下:

#include <stdio.h>

//一个无返回值,无参数的函数声明
void a();

//一个无返回值,有1个int参数的函数声明
void b(int a);

//有1个int类型参数和1个double类型参数 ,且有返回值为int类型的函数
int c(int a,double d);

//函数a的定义
void a()
{
	printf("a");
}

//函数b的定义
void b(int a)
{
	printf("b");
}

//函数c的定义
int c(int a, double d)
{
	printf("c");
	//有返回值必须返回一个值
	return 0;
}

int main()
{
	return 0;
}

当然,函数在定义的时候,如果未声明,会自动声明。
所以也可以这样:

#include <stdio.h>

//函数a的定义,前面未声明在此处自动声明
void a()
{
	printf("a");
}

//函数b的定义,前面未声明在此处自动声明
void b(int a)
{
	printf("b");
}

//函数c的定义,前面未声明在此处自动声明
int c(int a, double d)
{
	printf("c");
	//有返回值必须返回一个值
	return 0;
}

int main()
{
	return 0;
}

那么问题来了,既然定义时候会自动声明,那为什么还要声明呢?这是因为文件扫描是从上往下的,如果发现调用了一个函数,可函数在下面实现。那么就无法识别到这个函数。
例如:

#include <stdio.h>

//函数a的定义
void a()
{
	printf("a");
}

int main()
{
	
	a();//调用函数a

	return 0;
}

这个代码因为定义在main函数的前面,所以可以调用。但是如果定义在main函数的下面,那么main函数调用a函数时,无法识别到a,就会出错。

#include <stdio.h>

int main()
{
	
	a();//调用函数a

	return 0;
}

//函数a的定义
void a()
{
	printf("a");
}

在这里插入图片描述
所以这时候加上声明,就可以正常运行了。
在这里插入图片描述

💪7.3 函数的调用和传参

🔮7.3.1 函数的调用

函数的调用很简单,上面就有演示。
函数的调用格式: 函数名(参数列表);
参数列表要和函数定义时的参数列表匹配
函数调用的例子:

#include <stdio.h>

//函数 a没有参数
void a()
{
	printf("a");
}
//函数 b有1个int参数
void b(int b)
{
	printf("b");
}

int main()
{
	
	a();//函数名(参数列表); 但是函数a没有参数,所以不用传参
	b(1); //函数名(int); 因为函数定义时有1个int类型参数,所以必须传1个int类型
	return 0;
}

🔮7.3.2 函数的传参

函数的传参上面调用b时也演示过了,就是根据函数定义(声明)时的参数列表一一对应传参。所以再为大家提供几个传参例子。

#include <stdio.h>

//参数列表 (int)
void b(int b)
{
	printf("b");
}

//参数列表 (int,double,char)
void c(int a,double b , char c)
{
	printf("b");
}


int main()
{
	b(1);//传参列表(int)
	c(1,1.1,'a'); //传参列表(int,double,char); 
	return 0;
}

不过需要注意的是, 传参给函数的参数叫实参。而函数接收的参数叫形参,形参是实参的临时拷贝,改变形参不会影响实参的值。

#include <stdio.h>

//参数列表 (int)
void b(int c)
{
	c = 5;
}

int main()
{
	int c = 2;
	b(c);//传参列表(int)
	printf("%d ", c);
	return 0;
}

如图,C的值并没有发生改变
在这里插入图片描述

💪7.4 函数的返回值

当你期待一个函数会返回你一个特定的值时,你可以选择带返回值的函数。如果没有返回值,那么返回值的类型就是void。

假设我要实现一个Add函数,用来求2个数的和。

#include <stdio.h>

//返回值的数据类型为int
int Add(int x, int y)
{
	int z = x + y;
	return z;
}

int main()
{
	int z = Add(3, 5); //用 z 来接收函数的返回值
	printf("%d ", z);
	return 0;
}

在这里插入图片描述

💪7.5 函数的传址调用

如果我们期望改变实参的值,我们可以选择传址调用,传址调用就是传指针给函数。然后函数对指针指向的空间进行操作。

#include <stdio.h>
void Swap(int* a,int* b)
{
	int tmp = *a;
	*a = *b;
	*b = tmp;
}

int main()
{
	int a = 10;
	int b = 20;
	printf("%d,%d\n", a, b);
	Swap(&a, &b);//传a和b的地址进去
	printf("%d,%d\n", a, b);

	return 0;
}

我们会发现a 和 b 的值发生了变化。因为我们给函数传的是 a 和 b的地址,而函数内部通过对a 和 b 解引用找到 a和b所在的内存空间。从而让它们进行交换。
在这里插入图片描述

💪7.6 函数的嵌套调用

函数的嵌套调用,就是我们在另外一个函数调用其他函数。

#include <stdio.h>

void b()
{
	printf("b\n");
}

void a()
{
	printf("a\n");
	b(); //a函数里面调用 b函数
}

int main()
{
	a();//main函数里面调用函数a
	return 0;
}

在这里插入图片描述
所以,函数也是可以嵌套调用的。

💪7.7 函数的递归

递归,栈溢出的罪魁祸首!什么是递归呢?简单来说,就是函数自己调用自己本身。比如以下代码,main函数一直调用自己。如果没有递归的终止条件的话,那么就会出现栈溢出。

#include <stdio.h>

int main()
{
	main();
	return 0;
}

在这里插入图片描述

所以在使用递归时,我们需要注意两点,一点是递归的结束条件,还有一点就是这个条件每递归一次都要发生变化。

比如我想实现一个函数,要求把一串数字倒着输出。

#include <stdio.h>

void a(int n)
{
	//当n=0时,递归终止
	if (n == 0)
	{
		return;
	}
	printf("%d ", n % 10);
	//自己调用自己
	a(n / 10);
}

int main()
{
	int n = 12345;
	a(n);
	return 0;
}

在这里插入图片描述

以上程序的递归展开图:
在这里插入图片描述

结言🥳:

💦💦如果有写的不好或者错误的地方,希望大家指证出来,我会不断的改正自己的错误。💯💯如果感觉写的还可以,可以点赞三连一波哦~🍸🍸后续会持续为大家更新大纲上的内容,以及数据结构,C++,Linux操作系统等方面的知识,本人会坚持持续更新。

🌺🌺拖着发烧的身体也要更新!你们的支持是我最大的动力,希望在往后的日子里,我们大家一起进步!!!
🌺🌺

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

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

相关文章

【Spring【IOC】】——17、@Resource注解和@Inject注解?

&#x1f4eb;作者简介&#xff1a;zhz小白 公众号&#xff1a;小白的Java进阶之路 专业技能&#xff1a; 1、Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理 2、熟悉Java基础&#xff0c;并精通多线程的开发&#xff0c;熟悉JVM原理&#xff0c;具备⼀定的线…

【算法题解】6.合并两个有序数组

文章目录题目解法一&#xff1a;双指针解题思路图解代码实现复杂度分析解法二&#xff1a;逆向双指针解题思路图解代码实现复杂度分析题目 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2&#xff0c;另有两个整数 m 和 n &#xff0c;分别表示 nums1 和 nums2 中的元素…

Plaxis软件:Python命令流自动建模与应用

有限单元法在岩土工程问题中应用非常广泛&#xff0c;很多商业软件如Plaxis/Abaqus/Comsol等都采用有限单元解法。在使用各大软件进行数值模拟建模的过程中&#xff0c;您是否发现GUI界面中重复性的点击输入工作太繁琐&#xff1f;从而拖慢了设计或方案必选进程&#xff1f;针对…

day30【代码随想录】回溯之分割回文串、复原IP地址、子集

文章目录前言一、分割回文串&#xff08;力扣131&#xff09;二、复原IP地址&#xff08;力扣93&#xff09;三、子集&#xff08;力扣78&#xff09;总结前言 1、分割回文串 2、复原IP地址 3、子集 一、分割回文串&#xff08;力扣131&#xff09; 给你一个字符串 s&#xf…

Win10如何显示文件后缀名?显示后缀名的简单方法

现在大多数用户使用的电脑都是Win10系统&#xff0c;有时我们重装电脑系统&#xff0c;会发现电脑出现一些问题&#xff0c;比如文件后缀名不显示出来。如何显示文件后缀名&#xff1f;方法很简单&#xff0c;跟着下面的详细操作步骤走&#xff0c;轻轻松松Get回消失的文件后缀…

Http和Https和SSL工作原理

相关概念 Http&#xff1a;超文本传输协议&#xff08;Hyper Text Transfer Protocol&#xff0c;HTTP&#xff09;是一个简单的请求-响应协议&#xff0c;它通常运行在TCP之上&#xff0c;是Web协议族中非常重要的一个协议。协议版本包含Http1.0、Http1.1 和Http2.0. Https&…

【3D游戏基础】蒙皮骨骼动画与骨架

效果目标&#xff01;画出蒙皮动画的骨架。视频https://www.bilibili.com/video/BV1pM411m7YwPPThttps://zfxdvouj61.feishu.cn/file/boxcnwgESO6zdQetO7oNhKboNsd以下为PPT文字稿&#xff0c;建议还是看视频讲讲自己对蒙皮骨骼动画的理解&#xff0c;并在 Cocos Creator 3.6 中…

全志Tina Linux MPP (多媒体框架)开发指南支持百问网T113 D1-H哪吒DongshanPI-D1s V853-Pro等开发板

1 简述 整理 MPP sample 使用说明文档的目的是&#xff1a;使 MPP sample 更好用。 2 简介 MPP sample 一般存放在 MPP Middleware 的 sample 目录下。此外&#xff0c;MPP Framework 的 demo 目录下也有一些 sample。 本文档主要介绍 MPP Middleware 各 sample 的基本使用方…

【再学Tensorflow2】TensorFlow2的建模流程:疫情发展趋势分析

TensorFlow2的建模流程&#xff1a;疫情发展趋势分析时间序列简介基本概念平稳性白噪声随机游走&#xff08;Random Walk&#xff09;识别一个时间序列Augmented Dickey-Fuller Test(ADF)Kwiatkowski-Phillips-Schmidt-Shin Test(KPSS)时间序列模型预测准确度的衡量衡量预测准确…

舆情监测系统适用哪些行业,如何选择舆情监测系统?

当前&#xff0c;去网上搜索第三方舆情监测工具可以看到很多家不同公司的产品&#xff0c;比如TOOM舆情监测系统&#xff0c;那我们该如何选择舆情监测系统?舆情监测系统到底适用什么行业&#xff0c;带着这些疑问&#xff0c;接下来我们简单了解一下。 ​一、舆情监测系统适…

6.前端笔记-JS-流程控制

1、流程控制 通过控制代码的执行顺序实现我们要完成的功能。控制代码按照什么结构顺序执行 有三种结构&#xff1a;顺序结构、分支结构、循环结构 1.1 顺序流程控制 最简单、最基本的流程控制。程序按照代码的先后顺序&#xff0c;依次执行 1.2 分支流程控制 从上到下执行…

ArcGIS基础实验操作100例--实验8绘制中点连线

本实验专栏来自于汤国安教授《地理信息系统基础实验操作100例》一书 实验平台&#xff1a;ArcGIS 10.6 实验数据&#xff1a; 请访问实验1&#xff08;传送门&#xff09; 基础编辑篇--实验8 绘制中点连线 目录 一、实验背景 二、实验数据 三、实验步骤 &#xff08;1&…

【操作系统】CPU平均负载和使用率

1.CPU的平均负载 &#xff08;1&#xff09;什么是CPU的平均负载 单位时间内系统处于【可运行状态】和【不可中断状态】的平均进程数&#xff0c;就是平均活跃进程数&#xff0c;和CPU使用率并没有直接关系 可运行状态 正在使用CPU或者正在等待CPU的进程用 ps aux命令看到的…

【OpenCV-Python】教程:9-1 级联分类器训练

OpenCV Python 级联分类器训练 【介绍】 使用增强的弱分类器级联包括两个主要阶段: 训练和检测阶段。使用基于HAAR或LBP模型的检测,在object detection tutorial中进行了描述。本文档概述了训练您自己的增强弱分类器级联所需的功能。当前的手册将走过所有不同的阶段: 收集训练…

机器学习-决策树算法原理及实现-附python代码

1.决策树-分类树 sklearn.tree.DecisionTreeClassifier官方地址&#xff1a; https://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html#sklearn.tree.DecisionTreeClassifier 在机器学习中&#xff0c;决策树是最常用也是最强大的监督学…

用双因子认证2FA替换Google authenticator谷歌令牌,助力准上市公司实现等保安全审计

21世纪初&#xff0c;某人力资源科技公司试水HR SaaS赛道&#xff0c;以大客户为目标客群&#xff0c;持续深耕&#xff0c;稳扎稳打&#xff0c;如今已是一家专门为中大型企业提供一体化HR SaaS及人才管理产品/解决方案的头部企业。其产品覆盖了从员工招募、入职、管理到离职的…

Linux系统安装Mysql5.7(详解)

Linux系统上安装软件的3种方式&#xff1a; 本次使用二进制发布包安装方式安装Mysql5.7 &#xff08;一&#xff09;下载Mysql5.7的二进制包 这里可以选择去Mysql官网下载&#xff0c;但是由于服务在外国&#xff0c;下载速度实在是太慢了。这里我们可以选择去阿里云的镜像网…

数据通信基础 - 解调技术(PCM)

文章目录1 概述2 脉冲编码调制技术2.1 采样2.2 量化2.3 编码3 扩展3.1 网工软考真题1 概述 #mermaid-svg-K45XtgYRoAw04KU0 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-K45XtgYRoAw04KU0 .error-icon{fill:#5522…

医疗影像工具LEADTOOLS 入门教程: 使用文档编写器创建文档 - 控制台 C#

LEADTOOLS是一个综合工具包的集合&#xff0c;用于将识别、文档、医疗、成像和多媒体技术整合到桌面、服务器、平板电脑、网络和移动解决方案中&#xff0c;是一项企业级文档自动化解决方案&#xff0c;有捕捉&#xff0c;OCR&#xff0c;OMR&#xff0c;表单识别和处理&#x…

【数据结构】Leedcode消失的数字(面试题)

目录 一、题目说明 二、题目解析 一、题目说明 题目链接: leetcode消失的数字 数组nums包含从0到n的所有整数&#xff0c;但其中缺了一个。请编写代码找出那个缺失的整数。你有办法在O(n)时间内完成吗&#xff1f; 示例1&#xff1a; 输入&#xff1a;[3,0,1] 输出&#x…