C语言入门篇——函数篇

目录

1、什么是函数

2、函数的分类

2.1库函数

2.2自定义函数

3、函数的参数

3.1实际参数(实参)

3.2形式参数(形参)

4、函数的调用

4.1传值调用

4.2传址调用

5、函数的嵌套调用和链式访问

5.1嵌套调用

5.2链式访问

6、函数的声明和定义

6.1 函数声明

6.2 函数定义

7、函数递归


1、什么是函数

首先,什么是函数?函数(function)是完成特定任务的独立程序代码。单元语法规则定义了函数的结构和使用方式。虽然C中的函数和其他语言中的函数、子程序、过程作用相同,但是细节上略有不同。

为什么使用函数?

首先,使用函数可以省去编写重复代码的苦差,当程序需要多次实现同种功能的时候,只需要编写一个合适的函数,就可以省去很多的时间和代码篇幅;其次,即使程序只完成某项任务一次,也值得使用函数。因为函数让程序更加模块化,从而提高了程序代码的可读性,更方便后期修改、完善。

2、函数的分类

C语言中函数分为库函数和自定义函数。

2.1库函数

为什么有库函数?

1、在学习C语言编程的时候,总是在一个代码编写完成之后迫不及待的想知道结果,想 把这个结果打印到我们的屏幕上看看。这个时候我们会频繁的使用一个功能:将信息按照一定的格 式打印到屏幕上(printf)。

2、在编程的过程中我们会频繁的做一些字符串的拷贝工作(strcpy)。

3.、在编程时我们也计算,总是会计算n的k次方这样的运算(pow)。

像上面我们描述的基础功能,它们不是业务性的代码。我们在开发的过程中每个程序员都可能用的到, 为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。

学习库函数我们就非常需要一些辅助网站或者工具,例如:

  1. MSDN(Microsoft Developer Network)
  2. www.cplusplus.com
  3. http://en.cppreference.com(英文版)
  4. http://zh.cppreference.com(中文版)

这里附上第一个工具的下载链接:链接:https://pan.baidu.com/s/1HMd4INww7KHBvcSjMSZ6Og?pwd=1234 
提取码:1234

C语言常用的库函数有:IO函数,字符串操作函数,字符操作函数,内存操作函数,时间/日期函数,数学函数,其他库函数。使用库函数一定要包含#include对应的头文件,一些不常用的函数我们不知道其对应的头文件,这时候就需要通过工具来查看其对应的头文件。

2.2自定义函数

有的时候程序员需要实现的功能是非常复杂的,库函数也没有提供实现相应功能的函数,这个时候就需要就需要我们程序员来进行编写自定义函数,

自定义函数和库函数一样,有函数名,返回值类型和函数参数,但不一样的是自定义函数中,以上这些都是我们程序员设计,这就使得自定义函数实现的功能比库函数实现功能要复杂且精巧。

函数的组成语法:

ret_type fun_name(para1, * )
{
     statement;//语句项
}

名词解释:

ret_tyoe:返回类型

fun_name:函数名

paral:函数参数

这里先编写一下几个简单的函数来深刻认识一下自定义函数,例如找最大值函数和交换变量函数:

void swap(int x, int y)
{
	printf("x = %d,y = %d\n", x, y);

	int temp = 0;
	temp = x;
	x = y;
	y = temp;

	printf("x = %d,y = %d\n", x, y);
}

int main(void)
{
	int x = 10, y = 20;
	int m_max = max(x, y);
	printf("x和y里的最大值为:%d\n", m_max);

	swap(x, y);

	return 0;
}

3、函数的参数

3.1实际参数(实参)

真实传给函数的参数叫实参,实参可以是:常量、变量、表达式、函数等。

无论实参是何种类型的量,在进行该函数调用时,它们都必须有确定的值,以便把这些值传送给形参。

3.2形式参数(形参)

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

形参实例化之后其实相当于实参的一份临时拷贝

通过代码我们将更为深刻地认识实参和形参这两个概念:

4、函数的调用

4.1传值调用

函数的形参和实参分别占有不同内存块,对形参的修改不会影响实参。

4.2传址调用

传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。

这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。

当我们不需要修改实参的时候,应该使用传值调用,防止在函数内修改我们不需要修改的实参;当我们需要修改实参的时候,应该使用传址调用,函数内部也能修改函数外部的变量。

5、函数的嵌套调用和链式访问

5.1嵌套调用

函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。

怎么理解这句话,在大型程序设计的时候,一个功能里面经常需要使用其他功能函数,C语言是允许自定义函数互相调用的。用一个简单的例子来检验一下C语言是否支持:

函数可以嵌套调用,但是不能嵌套定义。

5.2链式访问

把一个函数的返回值作为另外一个函数的参数。

scanf和printf函数就可以进行链式访问。详情可查阅这篇博客:https://blog.csdn.net/sakura0908/article/details/130298477?spm=1001.2014.3001.5501

6、函数的声明和定义

6.1 函数声明

函数声明语法:

ret_type fun_name(para1, * );

1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数 声明决定不了。

2. 函数的声明一般出现在函数的使用之前。要满足先声明后使用。

3. 函数的声明一般要放在头文件中的。

声明函数时必须声明函数的类型,带返回值的函数类型应该与其返回值类型相同,而没有返回值的函数应该声明为void。如果没有声明函数的类型,旧版本的C编译器会假定函数的类型是int。这一管理源于C的早期,那时的函数绝大多数都是int类型,然而C99标准不再支持int类型函数的这种假定设置。

6.2 函数定义

函数定义语法:

ret_type fun_name(para1, * )
{
     //函数功能实现
     statement;//语句项
}

函数的定义是指函数的具体实现,交待函数的功能实现。

函数声明和函数定义常用于多文件编写的程序中,函数声明放在自定义的的头文件.h中,而函数定义放在一个对应的.c文件中,在主函数的.c文件中需要包含自定义的头文件之后才能使用自定义的函数。

7、函数递归

程序调用自身的编程技巧称为递归( recursion)。 递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接 调用自身的 一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解, 递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。 递归的主要思考方式在于:把大事化小

递归的两个必要条件

  1. 存在限制条件,当满足这个限制条件的时候,递归便不再继续
  2. 每次递归调用之后越来越接近这个限制条件

在调试 factorial 函数的时候,如果你的参数比较大,那就会报错: stack overflow(栈溢出) 这样的信息。 系统分配给程序的栈空间是有限的,但是如果出现了死循环,或者(死递归),这样有可能导致一 直开辟栈空间,最终产生栈空间耗尽的情况,这样的现象我们称为栈溢出。

学习函数递归,就不得不说函数求阶乘这一经典案例,数学中,阶乘的定义是:一个正整数的阶乘factorial)是所有小于及等于该数的正整数的积,并且0的阶乘为1。自然数n的阶乘写作n!。

那如何解决上述的问题:

1. 将递归改写成非递归。

2. 使用static对象替代 nonstatic 局部对象。在递归函数设计中,可以使用 static 对象替代 nonstatic 局部对象(即栈对象),这不仅可以减少每次递归调用和返回时产生和释放 nonstatic 对象的开销,而且 static 对象还可以保存递归调用的中间状态,并且可为各个调用层所访问

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】模板

目录 前言 1.函数模板 1.1使用 1.2实现逻辑 1.3实例化 1.4匹配规则 2.类模板 2.1使用 实例化 前言 🎗️照以前的想法,若我们想实现一个交换函数,需要这样写。 void swap(int& x, int& y) {int tmp x;x y;y tmp; }int …

自动驾驶方案及相关对标

华为: 2021年4月18日,在华为智能汽车解决方案BU新品发布会上,华为智能汽车解决方案BU总裁王军表示,华为要持续加大对汽车行业的投入,今年在研发上的投资将达到10亿美元,未来每年保持30%左右增长&#xff0…

[Netty] Mpsc Queue (十七)

JCTools 是适用于 JVM 并发开发的工具,主要提供了一些 JDK 确实的并发数据结构,例如非阻塞 Map、非阻塞 Queue 等。其中非阻塞队列可以分为四种类型,可以根据不同的场景选择使用。 Spsc 单生产者单消费者Mpsc 多生产者单消费者Spmc 单生产者…

【AI生产力工具】Midjourney:为创意人士提供创造性灵感和支持的工具

文章目录 一、Midjourney是什么?二、Midjourney的优势三、Midjourney的应用四、结语 在现代社会,创意和创新成为越来越重要的能力。然而,创意灵感的获取却不是一件容易的事情,这就需要我们使用一些辅助工具来帮助我们发现和实现创…

Docker容器---网络、容器操作

Docker容器---网络、容器操作 一、docker实现原理二、docker网路模式1、Host模式2、container模式3、none模式4、bridge模式 三、自定义网络1、查看网络模式列表2、查看容器信息3、指定分配IP地址4、自定义网络固定IP 四、暴露端口五、容器端口映射1、创建端口映射 六、资源控制…

达梦数据迁移问题罗列

目录 一、前言 二、问题罗列 一、前言 最近小编接触到国产的数据库达梦数据库,然后在用达梦数据迁移工具MySQL迁移至达梦的时候遇到了一系列的问题现在罗列一下在这里。目前关于国产的数据库达梦这些资料比较少,希望能够帮到有需要的同志们&#xff01…

零代码是什么?零代码平台适合谁用?

随着信息技术的发展,软件开发领域也不断发生变革,零代码(No-Code)开发模式越来越受到关注。 零代码到底是什么,能不能用通俗的话来说?这就来给大家讲一讲! 01 零代码为什么出现? 随…

Java基础——缓冲流

(1)缓冲流概述: 缓冲流也称高效流,或者高级流。(字节流可称原始流)作用:缓冲流自带缓冲区,可以提高原始字节流,字符流读写数据的性能。 (2)字节缓…

【工作思考】如何提升自己的编程能力?

文章目录 前言一、代码评审为什么要进行代码评审? 二、持续学习能力三、良好的编程习惯代码注释避免深度嵌套拒绝长函数重视自测文档编写重构你的代码学会思考 四、多接触开源项目五、总结 前言 在工作中,我们大部分的时间都是在阅读代码,阅…

无人机影像处理流程

无人机由于其方便快捷,精度高等特点已经广泛应用于农田尺度的作物生长监测。尤其是近年来大疆推出了两个多光谱无人机,价格也相较便宜。但目前无人机的使用实际上需要进一步处理才能获取得到农田的基本信息,主要包括影像的校正和图像拼接&…

[oeasy]python0139_尝试捕获异常_ try_except_traceback

尝试捕获异常 回忆上次内容 变量相加 整型数字变量可以相加字符串变量也可以拼接 但是 字符串 和 整型数字整型数字 和 字符串不能相加 怎么办? 转格式int(“1”)str(2) 可是 如果输入的苹果数量是 字符串"abc" int(“abc”)会发生什么?&…

OpenText Exceed TurboX (ETX) 安全功能介绍

OpenText Exceed TurboX (ETX) 安全功能介绍 将所有重要的知识产权(IP )相关数据保存在受良好保护的中央数据中心是保护 IP 的最佳做法。安全的远程访问是保护知识产权的关键。 所有数据流量均采用最新标准加密技术进行加密ETX 整合多种身份验证系统ET…

Python爬虫之MongoDB

目录 一、Mongo概述 二、安装&下载 1.下载: 2.安装 三、基本命令 插⼊数据 查询数据 修改数据 删除数据 索引 四、Python与MongoDB交互 1.安装pymongo 2.使⽤ 一、Mongo概述 MongoDB是什么? MongoDB是⾮关系型数据库(No sql) 为啥需要…

吃透Redis面试八股文

Redis连环40问,绝对够全! Redis是什么? Redis(Remote Dictionary Server)是一个使用 C 语言编写的,高性能非关系型的键值对数据库。与传统数据库不同的是,Redis 的数据是存在内存中的&#xf…

原来这就是所谓的 JSR!

相信大家在学习 Java 的过程中,或多或少都见过 JSR 这个词。本篇文章就科普下什么是 JSR。 什么是 JSR ? JSR(Java Specification Requests),是指 Java 规范请求(或者活规范提案)。这个请求&a…

API 自动化测试难点总结与分享

笔者是 API 管理工具的项目参与者之一,在日常工作中会经常遇到 API 自动化测试难点,我决定总结分享给大家: API 自动化测试的难点包括: 接口的参数组合较多,需要覆盖各种可能的情况。 接口的状态和数据关联较多&#…

typescript全局安装卸载以及npm相关问题

全局安装 npm install -g typescript 全局安装之后,如果想要卸载要使用 npm uninstall -g typescript 全局安装之后可以在终端使用 tsc xxx 编译ts文件 本地安装,也就是在项目目录下安装 npm install typescript 本地卸载 npm uninstall type…

2022年中国广义数据智能市场规模为442亿元

数据智能是当前市场上的热点应用。但业界对于数据智能的发展状况,缺乏深入探讨与研究。为了系统梳理中国数据智能行业市场全景,厘清行业发展脉络,为从业者提供有价值的借鉴,海比研究院联合中国软件网、中国软件行业协会应用软件产…

camunda如何处理流程待办任务

在 Camunda 中处理流程任务需要使用 Camunda 提供的 API 或者用户界面进行操作。以下是两种常用的处理流程任务的方式: 1、通过 Camunda 任务列表处理任务:在 Camunda 任务列表中,可以看到当前需要处理的任务,点击任务链接&#…

【谷歌扩展程序入门】简单制作一个查看网页结构的扩展程序

简言 在想看网页结构的时候一般会F12查看元素内容。 太麻烦了 还不简单方便。 扩展程序 扩展建立在诸如 HTML、JavaScript 和 CSS 之类的 Web 技术之上。它们在单独的沙盒执行环境中运行并与 Chrome 浏览器交互。 扩展允许您通过使用 API 修改浏览器行为和访问 Web 内容来“扩…
最新文章