【函数】你上街买菜用的着函数吗?

news2024/11/26 10:20:23

前言

函数是什么

每个C程序都至少有一个函数,即main主函数 ,如果程序的任务比较简单,全部的代码都写在main函数中,但是在实际开发中,程序的任务往往比较复杂,如果全部的代码都写在main函数中,main函数体将非常庞大臃肿,代码重复。
我们可以把分工不同的代码放到子程序中,函数(子程序)是一个程序中的某部分代码,由一个或多个语句块组成,负责完成某项特定任务,而且相较于其他代码,具备相当对的独立性。
为了方使理解,我们把函数分为库函数自定义函数
在这里插入图片描述

目录

  • 前言
    • 函数是什么
  • 1. 库函数
  • 2. 自定义函数
  • 3. 函数参数
    • 3.1 实参
      • 3.2 形参
  • 4. 函数的声明和定义
    • 4.1 函数声明
      • 4.2 函数定义
  • 5. 函数调用
    • 5.1 传值调用
      • 5.2 传址调用
  • 6. 函数的嵌套调用和链式访问
    • 6.1 嵌套调用
      • 6.2 链式访问
  • 7. 函数递归
    • 递归的两个必要条件

1. 库函数

库函数是C语言库提供的函数,为了实现一些基本的功能,例如我们在写代码的时候用到的(printf)函数和(scanf)函数,都可以拿来直接使用。
像这些代码他们不是业务性的代码,我们在开发的的过程中每个程序员都可以使用,为了支持可移植性和提高程序的效率,所有C语言的基础库中提供了一系列类似的库函数。
使用库函数也是需要 #include 对应的头文件

#include <stdio.h>

int main()
{
	int n = 0;
	scanf("%d", &n);
	printf("%d\n", n);
	return 0;
}

C语言常用的库函数都有:

  • IO函数
  • 字符串操作函数
  • 字符操作函数
  • 内存操作函数
  • 时间/日期函数
  • 数学函数
  • 其他库函数

下面推荐一个学习库函数的网站:
Cplusplus

2. 自定义函数

如果库函数能干所有的事情,那还要程序员干什么?
所以更加重要的是自定义函数。
自定义函数和库函数一样,有函数名,返回值类型和函数参数。
但是不一样的是这些都是我们自己来设计。

函数组成:

ret_type fun_name(para1 ... )
{
 statement;//语句项
}
//ret_type 返回类型
//fun_name 函数名
//para1    函数参数

我们举一个例子:

写一个函数找出两个整数的最大值

#include <stdio.h>

int max(int x, int y)
{
	return x > y ? x : y;
}

int main()
{
	int a = 0;
	int b = 0;
	scanf("%d %d", &a, &b);
	int ret = max(a, b);
	printf("%d\n", ret);
	return 0;
}

3. 函数参数

3.1 实参

真实传给函数的参数,叫实参。
实参可以是:常量、变量、表达式、函数等。
无论实参是何种类型的量,在进行函数调用时,它们都必须有确定的值,以便把这些值传送给形参。

3.2 形参

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

例如:

交换两个整数的内容:因为形参x,y有自己独立的空间,改变形参不会影响到实参的内容。

void swap(int x, int y)
{
	int tmp = x;
	x = y;
	y = tmp;
}

int main()
{
	int a = 3;
	int b = 5;
	swap(a, b);
	printf("%d %d\n", a, b);
	return 0;
}

结论:
形参是实参的一份临时拷贝,改变形参不会影响到实参

4. 函数的声明和定义

4.1 函数声明

  1. 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么,但是具体是不是存在,函数声明决定不了。
  2. 函数的声明一般出现在函数的使用之前,要满足先声明后使用
  3. 函数的声明一般要放在头文件中。

test.h头文件:

#include <stdio.h>

//函数声明
int max(int x, int y);

4.2 函数定义

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

max.c内容:

#include "test.h"
//函数定义
int max(int x, int y)
{
	return x > y ? x : y;
}

5. 函数调用

5.1 传值调用

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

void swap(int x, int y)
{
	int tmp = x;
	x = y;
	y = tmp;
}
int main()
{
	int a = 3;
	int b = 5;
	swap(a, b);
	printf("%d %d\n", a, b);
	return 0;
}

5.2 传址调用

传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式。
这种传参方式可以让函数和函数外边的变量建立起真正的联系,也就是函数内部可以直接操作函数外部的变量。

void swap(int* pa, int* pb)//需要用指针接收
{
	int tmp = *pa;
	*pa = *pb;
	*pb = tmp;
}

int main()
{
	int a = 3;
	int b = 5;
	swap(&a, &b);//传址调用,取地址操作符
	printf("%d %d\n", a, b);
	return 0;
}

6. 函数的嵌套调用和链式访问

6.1 嵌套调用

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

例如:

void print()
{
	printf("1 ");
}

void loop_print()
{
	int i = 0;
	for (i = 0; i < 3; i++)
	{
		print();
	}
}

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

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

6.2 链式访问

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

例子1:

strlen函数:求字符串长度
strcar函数:拼接函数


我们把"bit"字符串拼接到"hello"字符串里,得到"hellobit"字符串
然后把strcat返回值交给strlen。

int main()
{
    char arr[20] = "hello";
    int ret = strlen(strcat(arr, "bit"));
    printf("%d\n", ret);
    return 0;
}

例子2:

这个问题就交给你们了(坏笑)

int main()
{
    printf("%d", printf("%d", printf("%d", 43)));
    //printf函数的返回值是打印在屏幕上字符的个数
    return 0;
}

7. 函数递归

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

可以看我之前写的递归的简介和例子:
递归链接点击这里

递归的两个必要条件

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

在这里插入图片描述

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

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

相关文章

Nginx配置整合:基本概念、命令、反向代理、负载均衡、动静分离、高可用

一、基本概念 1.什么是Nginx Nginx是一个高性能的HTTP和反向代理服务器&#xff0c;也是一个IMAP/POP3/SMTP代理server。其特点是占有内存少。并发能力强&#xff0c;其并发能力确实在同类型的网页server中表现较好。 http服务器 Web服务器是指驻留于因特网上某种类型计算机的程…

热门的Java开源项目

1 JCSprout https://github.com/crossoverJie/JCSprout Star 17084 这是一个还处于萌芽阶段的 Java 核心知识库。分为常用集合、Java多线程、JVM、分布式相关、常用框架等内容 2 arthas https://github.com/alibaba/arthas Star 6836 Arthas旨在帮助开发人员解决Java应用程…

高级网络应用复习——三层交换DHCP中继(带命令)

作者简介&#xff1a;一名在校云计算网络运维学生、每天分享网络运维的学习经验、和学习笔记。 座右铭&#xff1a;低头赶路&#xff0c;敬事如仪 个人主页&#xff1a;网络豆的主页​​​​​​ 目录 前言 一.知识点总结 二.DHCP中继实验 实验要求 实验命令 三层交换…

腾讯会议人数上限进不去?

很多用户都在使用腾讯会议来进行线上会议&#xff0c;因此经常会出现人数到达上限进不去的情况&#xff0c;非常令人头疼&#xff0c;那这时候要怎么办呢&#xff1f;下面就来看看解决办法。 腾讯会议人数上限进不去怎么办&#xff1f; 答&#xff1a;只能等待有人退出后再加入…

数据结构入门-单调队列

数据结构入门-单调队列 原理介绍 双向队列 思考一下&#xff1a;对于数组nums&#xff0c;我们想知道max(nums[i-k],...,nums[i])如何高效处理&#xff1f; 单调队列 单调队列&#xff0c;即从队首到队尾单调的队列。 #mermaid-svg-6PhVAHBib6ohdcIC {font-family:"tre…

从mask rcnn到mask scoring rcnn

mrcnn (mask rcnn) 不足:框架没有解决实例分割评分 对mask head输出的K(类别)个mask,选择哪个mask作为最终的输出,取决于分类支路置信度最高的类别。也就是用分类置信度来衡量mask质量,这会导致下图的现象: 左侧四幅图像显示出良好的检测结果,具有高分类分数但掩模质…

【spring系列】SPI详解

1.什么是SPI SPI全称Service Provider Interface&#xff0c;是Java提供的一套用来被第三方实现或者扩展的接口&#xff0c;它可以用来启用框架扩展和替换组件。 SPI的作用就是为这些被扩展的API寻找服务实现。2.SPI和API的使用场景 API &#xff08;Application Programming …

大数据Kudu(七):Kudu分区策略

文章目录 Kudu分区策略 一、​​​​​​​Partition By Range - 范围分区

最通俗易懂的 JAVA slf4j,log4j,log4j2,logback 关系与区别以及完整集成案例

最近在工作中&#xff0c;发现接触到的很多小伙伴分不清楚logback slf4j 以及log4j 的关系&#xff0c;有的人认为是一个东西&#xff0c;有的人认为是完全没关系&#xff0c;或者说有关系但是不清楚具体是什么区别和联系&#xff0c;今天咱们就简单梳理下他们之间的联系和区别…

项目式学习法(PBL)如何让你快速成为行业专家【一杯咖啡谈项目】

项目人人都是主角&#xff0c;没有旁观者。我们每个人也应当好PM&#xff0c;这就离不开学习提升自己&#xff0c;&#xff0c;如此&#xff0c;方能更好推动经济社会高质量发展。 1、项目式学习是什么&#xff1f; 关于项目式学习&#xff0c;目前国内外还没有个统一的定义&…

【python】 json字符串转对象

目录 一&#xff1a;json对象转换为json字符串 二&#xff1a;json字符串转换为json对象 三&#xff1a;json字符串{"name":"lily","sno":1001} 四&#xff1a;python面向对象程序设计 一&#xff1a;json对象转换为json字符串 import json…

Elasticsearch 安装及启动【Linux】

一、下载安装包 1.下载 Elasticsearch 官网下载地址&#xff1a;https://www.elastic.co/cn/downloads/past-releases#elasticsearch 2.下载 Kibana Kibana 数据可视化平台可以选择性安装 官网下载地址&#xff1a;https://www.elastic.co/cn/downloads/past-releases#kiban…

连续仨月霸占牛客榜首京东T8呕心巨作:700页JVM虚拟机实战手册

什么是Java虚拟机&#xff1f; 虚拟机是一种抽象化的计算机&#xff0c;通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构&#xff0c;如处理器、堆栈、寄存器等&#xff0c;还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息…

怎么防止同事用Evil.js的代码投毒

最近Evil.js被讨论的很多&#xff0c;项目介绍如下 项目被发布到npm上后&#xff0c;引起了激烈的讨论&#xff0c;最终因为安全问题被npm官方移除&#xff0c;代码也闭源了 作为一个前端老司机&#xff0c;我肯定是反对这种行为&#xff0c;泄私愤有很多种方式&#xff0c;代…

深度学习——多GPU训练代码实现

1.数据并行性。 一台机器有K个GPU&#xff0c;给定训练模型&#xff0c;每个GPU参数值是相同且同步&#xff0c;每个GPU独立地维护一组完整地模型参数。k2时数据并行地训练模型&#xff0c;利用两个GPU上的数据&#xff0c;并行计算小批量随机梯度下降。 K个GPU并行训练过程&a…

【Spring Cloud】Eureka注册中心从原理到实战图文详细教程

本期目录1. Eureka介绍1.1 Eureka能解决的问题2. Eureka原理3. 搭建Eureka Server3.1 引入依赖3.2 编写启动类3.3 修改配置文件3.4 启动Eureka微服务4. 服务注册4.1 导入依赖4.2 修改配置文件4.3 重启微服务4.4 启动多个微服务实例5. 服务发现5.1 修改业务层代码5.2 在RestTemp…

A_A05_002 sscom33串口调试助手使用

目录 一、软件获取 二、软件基本功能介绍 1、接收区 2、串口通信参数配置区 3、串口打开关闭与其他设置区域 4、手动发送区域 5、多文本发送区 6、辅助区域 三、注意事项 一、软件获取 网盘链接 直戳跳转 二、软件基本功能介绍 1、接收区 接收区就是接收外部设备给串口…

【2022年终总结】总结自己的2022,展望2023

目录一、工作杭州【述职-涨薪】【项目】从0到1&#xff0c;从1到多&#xff0c;在工作中寻找方法&#xff0c;承担更多的责任【技能】丰富了技术广度武汉1. 【项目】一个人就是一个团队二、成为博客新秀&前端领域优质创作者三、生活旅行猫猫情感2023年的flag学习&#xff1…

FFmpeg- 常用的滤镜命令

下面来熟悉一下常用的对视频操作的几个命令。这次需要完成的命令也包括在其中。 视频的画面大小的剪切(crop filter) 将输入的视频的帧&#xff0c;以左上角为坐标的原点&#xff0c;剪切成x,y坐标开始的指定大小。 语法&#xff1a; # []包裹的选项是可选的 crop ow[:oh[:x[:…

3D三维地图APP

3D三维地图APP 发布时间&#xff1a;2018-07-19 版权&#xff1a; 3D地图依据高程数据等对地表进行渲染&#xff0c;实现地表的起伏&#xff0c;模拟出真实的三维场景&#xff0c;让你有如身临其境般的感觉。 &#xff08;注&#xff1a;Bigemap 3D地图是一个三维地图浏览功能…