当前位置: 首页 > news >正文

详讲函数知识

目录

1. 函数是什么?

2. C语言中函数的分类:

2.1 库函数:

2.2 自定义函数

函数的基本组成:

 3. 函数的参数

3.1 实际参数(实参):

3.2 形式参数(形参):

写一个函数可以交换两个整形变量的内容

错误示范:

正确代码如下:

小结:

4. 函数的调用 

4.1 传值调用

4.2 传址调用

4.3 练习

4.3.1 写一个函数可以判断一个数是不是素数

4.3.2 写一个函数判断一年是不是闰年

4.3.3 写一个函数,实现一个整形有序数组的二分查找

4.3.4 写一个函数,每调用一次这个函数,就会将num的值+1


1. 函数是什么?

在数学中函数的概念大家应该都有所了解:y = f(x) ;我们可以代入x求出相应的y。但是,你了解C语言中的函数吗?

  • 函数其实就是一部分的代码,它们可能有一个或多个语句块组成。它负责完成某项特定任务,而且相较于其他代码,具有相对的独立性。
  • 一般有输入参数并会有返回值,提供对过程的封装和细节的隐藏。这些代码通常被集成为软件库。

2. C语言中函数的分类:

库函数和自定义函数

2.1 库函数:

为什么会有库函数?

  • 我们知道在我们学习C语言编程的时候,总是在一个代码编写完成之后迫不及待的想知道结果,想把这个结果打印到屏幕上看看。这个时候我们会频繁的使用一个功能:将信息按照一定的格式打印到屏幕上。(printf)
  • C语言官方了解到我们在编写代码的时候会有一些小动作会频繁大量的使用,如果有一个库函数来存放这些代码,这样我们就可以直接使用。如果没有这个库,那么同一个功能可能会有许多种写法,品质良莠不齐,可读性不高,可移植性不高。
  • 在C语言的标准库里提供了一系列C语言的库函数

学习库函数的网站:www.cplusplus.com

这里简单的介绍一下常用的库函数:

  • IO函数— — — — I=input; O=output; 输入输出函数:scanf、printf
  • 字符串操作函数— — — — strlen、strcmp……
  • 内存操作函数— — — — 大小写转换、字符分类
  • 时间/日期函数— — — — time
  • 数学函数— — — — pow、sqrt
  • 其他库函数

2.2 自定义函数

库函数不是万能的,只含有常用的函数,自定义函数更加重要!

自定义函数和库函数一样,有函数名,返回值类型和函数参数。

但是不一样的是自定义函数是由程序员自己设计的。这给程序员提供了一个很大的发挥空间。

函数的基本组成:

ret_type     返回类型 

fun-name   函数名

para 1        函数参数 — — 参数可以是0,可以是一个或多个

{   }内为函数体,函数体中包含的是语句项

 3. 函数的参数

3.1 实际参数(实参):

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

3.2 形式参数(形参):

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

写一个函数可以交换两个整形变量的内容

1.定义a、b存放并输入整数

2.先在屏幕中显示出原来的两个整形顺序,然后用自定义函数调换,最后在屏幕中显示改变顺序的整形。

3.写自定义函数:采用取地址的方式,将a、b取地址,定义一个tmp存放临时的数字,进行调换,最后取地址回去

错误示范:

void Swap(int x,int y)
{int tmp = x;x = y;y = tmp;
}int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);printf("交换前:a=%d b=%d\n",a,b);Swap(a, b);printf("交换后:a=%d b=%d\n", a, b);return 0;
}

这里主要的错误就是调用函数部分,我们通过调试可以看到:

 虽然我们的数值是给到了x、y,但是x、y的地址和a、b的地址不一样,就导致了即使我们交换了x、y,  a、b的数值也没有改变。

因此,我们在写调用函数时不使用x、y,改为取a、b的地址(指针)

正确代码如下:

void Swap(int* pa,int* pb)
{int tmp = *pa;*pa = *pb;*pb = tmp;
}int main()
{int a = 0;int b = 0;scanf("%d %d", &a, &b);printf("交换前:a=%d b=%d\n",a,b);Swap(&a, &b);printf("交换后:a=%d b=%d\n", a, b);return 0;
}

小结:

实参传递给形参的时候,形参是实参的一份临时拷贝,对形参的修改是不会影响实参的!

4. 函数的调用 

4.1 传值调用

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

(例如上面的错误示范)

4.2 传址调用

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

(例如上面的正确示范)

4.3 练习

  • 本章练习均以上一篇博客为基础忘记了的话可以看一下我前面的文章:C语言基础练习.2.里面有讲具体该如何操作

4.3.1 写一个函数可以判断一个数是不是素数

我们在之前写过一个“打印100-200之间的素数”,这次我们在原来的基础上面改动:

1.首先写主函数部分,定义i=100;使用for循环创建100-200之间的数字

2.用if语句,如果 i 是素数:打印并计数;

3.写调用函数,我在这里是创建is_prime为函数名。又因为我们最后要返回素数,所以返回类型为int

4.定义 j ,用for循环计算 i 是否为素数,如果是就返回1;如果不是则返回0,即不返回。

5.打印素数,并打印有几个素数

 代码如下:

int is_prime(int i)
{int j = 0;for (j = 2; j <= sqrt(i); j++){if (i % j == 0)return 0;}return 1;
}int main()
{int i = 0;int count = 0;for (i = 100; i <= 200; i++){if (1 == is_prime(i)){count++;printf("%d ", i);}}printf("\ncount=%d", count);return 0;
}

4.3.2 写一个函数判断一年是不是闰年

1.首先写主函数定义y=0;使用for循环创建出1000-2000之间的数字

2.用if语句判断是否为闰年,是就打印

3.写调用函数部分,使用if语句判断:是返回1,不是返回0

int is_leap_year(int y)
{if (((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0)))return 1;elsereturn 0;
}int main()
{int y = 0;for (y = 1000; y <= 2000; y++){if (1 == is_leap_year(y)){printf("%d ", y);}}return 0;
}

在此基础上,我们还能进行改良:

其实((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0))这一句如果正确返回值就为1

我们可以直接改为:

int is_leap_year(int y)
{return ((y % 4 == 0) && (y % 100 != 0) || (y % 400 == 0));
}

4.3.3 写一个函数,实现一个整形有序数组的二分查找

1.首先写主函数,创建数组,定义要查找的数字并使其可输入。计算数组长度,便于使用下标查找。

2.使用if语句,如果返回值为-1,则没找到(为什么用-1:因为下标不可能为负数;为什么不用0:因为如果要查找的数字是第一个,下标为0,会混乱),如果返回值为下标,则找到。

3.写调用函数部分:创建左下标left、右下标right、中间下标mid。采用二分查找,使用while循环,如果找到返回值为mid,如果不是则继续循环,如果找不到则返回-1。

int search(int arr[], int k, int sz)
{int left = 0;int right = sz - 1;while (left <= right){int mid = left + (right - left) / 2;if (arr[mid] < k){left = mid + 1;}else if (arr[mid] > k){right = mid - 1;}else{return mid;}return -1;}
}int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10};int k = 0;scanf("%d\n", k);int sz = sizeof(arr) / sizeof(arr[0]);int ret = search(arr, k,sz );if (ret == -1){printf("没找到\n");}else{printf("找到了,下标是:%d\n",ret);}return 0;
}

4.3.4 写一个函数,每调用一次这个函数,就会将num的值+1

1.首先写主函数,定义num=0;使其每一次被调用后打印

2.写调用函数,因为在上面我们知道如果我们直接用num是不能改变原来的数值的,所以我们用指针,又因为我们只是改变值不需要返回值,所以用void类型

void Add(int*p) 
{*p = *p + 1;//或者(*p)++;这里将指针括起来是因为++的优先级大于*,如果不括起来就会是p++的指针
}int main()
{int num = 0;Add(&num);printf("%d\n", num);Add(&num);printf("%d\n", num);Add(&num);printf("%d\n", num);return 0;
}

相关文章:

详讲函数知识

目录 1. 函数是什么&#xff1f; 2. C语言中函数的分类&#xff1a; 2.1 库函数&#xff1a; 2.2 自定义函数 函数的基本组成&#xff1a; 3. 函数的参数 3.1 实际参数&#xff08;实参&#xff09;&#xff1a; 3.2 形式参数&#xff08;形参&#xff09;&#xff1a; …...

gin 框架初始教程文档

一 、gin 入门1. 安装gin &#xff1a;下载并安装 gin包&#xff1a;$ go get -u github.com/gin-gonic/gin2. 将 gin 引入到代码中&#xff1a;import "github.com/gin-gonic/gin"3.初始化项目go mod init gin4.完整代码package mainimport "github.com/gin-go…...

Maven的下载和安装【详细】

文章目录一、什么是Maven&#xff1f;二、Maven的安装与配置2.1下载Maven安装包2.2配置Maven环境变量2.3验证三、Idea配置Maven3.1配置 setting.xml文件3.2Idea配置Maven一、什么是Maven&#xff1f; Apache Maven是个项目管理和自动构建工具&#xff0c;基于项目对象模型&…...

[数据结构]:04-循环队列(数组)(C语言实现)

目录 前言 已完成内容 循环队列实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-QueueCommon.cpp 04-QueueFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容&#xff0c;除其中使用到C引用外&#xff0c;全为C语言代码。使用C引用主要是为了…...

buu [GWCTF 2019]BabyRSA 1

题目描述&#xff1a; import hashlib import sympy from Crypto.Util.number import *flag GWHT{******} secret ******assert(len(flag) 38)half len(flag) / 2flag1 flag[:half] flag2 flag[half:]secret_num getPrime(1024) * bytes_to_long(secret)p sympy.nextp…...

codeforces 1669F

题意: alice和bob从数组两边的吃糖果, 数组的值就是糖果重量 要求alice和bob吃的糖果重量必须一样, 输出能吃几个糖果 这题最先想到的是前后缀相加 模拟一个前缀和 和 后缀和 在n/2的位置向前找前缀和 在n/2的位置向后找后缀和 找到第一个前缀和后缀和的下标输出就好 …...

高数考试必备知识点

三角函数与反三角函数的知识点 正弦函数 ysin x&#xff0c; 反正弦函数 yarcsin x • y sin x&#xff0c; x∈R&#xff0c; y∈[–1&#xff0c;1]&#xff0c;周期为2π&#xff0c;函数图像以 x (π/2) kπ 为对称轴 • y arcsin x&#xff0c; x∈[–1&#xff0c;1]…...

[蓝桥杯] 二分与前缀和习题练习

文章目录 一、二分查找习题练习 1、1 数的范围 1、1、1 题目描述 1、1、2 题解关键思路与解答 1、2 机器人跳跃问题 1、2、1 题目描述 1、2、2 题解关键思路与解答 1、3 四平方和 1、3、1 题目描述 1、3、2 题解关键思路与解答 二、前缀和习题练习 2、1 前缀和 2、1、1 题目描述…...

SpringMvc中HandlerAdapter组件的作用

概述 我们在使用springMVC时&#xff0c;都知道其中不仅包含handlerMapping组件还包含handlerAdapter组件&#xff0c;为什么呢&#xff1f; springMVC请求流程图 HandlerAdapter组件使用了适配器模式 适配器模式的本质是接口转换和代码复用&#xff0c;这里使用适配器模式的…...

FreeRTOS优先级翻转

优先级翻转优先级翻转&#xff1a;高优先级的任务反而慢执行&#xff0c;低优先级的任务反而优先执行优先级翻转在抢占式内核中是非常常见的&#xff0c;但是在实时操作系统中是不允许出现优先级翻转的&#xff0c;因为优先级翻转会破坏任务的预期顺序&#xff0c;可能会导致未…...

服务器部署—部署springboot之Linux服务器安装jdk和tomcat【建议收藏】

我是用的xshell连接的云服务器&#xff0c;今天想在服务器上面部署一个前后端分离【springbootvue】项目&#xff0c;打开我的云服务器才发现&#xff0c;过期了&#xff0c;然后又买了一个&#xff0c;里面环境啥都没有&#xff0c;正好出一期教程&#xff0c;方便大家也方便自…...

golang项目----家庭收支记账软件

家庭收支记账软件实现基本功能(先使用面向过程&#xff0c;后面改成面向对象)项目代码实现改进面向过程源码面向对象源码utils包中main包中实现基本功能(先使用面向过程&#xff0c;后面改成面向对象) 编写文件TestMyAccount.go完成基本功能 功能一&#xff1a;先完成可以显示…...

中国LNG市场投资机会研究

中国LNG市场投资机会研究中国LNG市场是一个具有巨大潜力和发展机遇的市场&#xff0c;尤其是在政府大力推动清洁能源发展的背景下&#xff0c;LNG市场投资机会正在不断扩大。首先&#xff0c;政府大力支持LNG市场的发展。政府实施的“十三五”规划将LNG作为清洁能源的重要来源&…...

Elasticsearch:索引数据是如何完成的

在我在之前的文章 “Elasticsearch&#xff1a;彻底理解 Elasticsearch 数据操作” 文章中&#xff0c;我详细地描述了如何索引数据到 Elasticsearch 中。在今天的文章中&#xff0c;我想更进一步来描述这个流程。 Elasticsearch 是一个非常强大和灵活的分布式数据系统&#x…...

处理器管理

处理器状态处理器管理是操作系统中重要组成部分&#xff0c;负责管理、调度和分配计算机系统的重要资源——处理器&#xff0c;并控制程序执行由于处理器管理是操作系统最核心的部分&#xff0c;无论是应用程序还是系统程序&#xff0c;最终都要在处理器上执行以实现其功能&…...

跟着我从零开始入门FPGA(一周入门系列)第五

5、同步和异步设计 前面已有铺垫&#xff0c;同步就是与时钟同步。 同步就是走正步&#xff0c;一二一&#xff0c;该迈哪个脚就迈那个脚&#xff0c;跑的快的要等着跑的慢的。 异步就是搞赛跑&#xff0c;各显神通&#xff0c;尽最大力量去跑&#xff0c;谁跑得快&#xff0c;…...

【第42天】Arrays.sort 与 Collections.sort 应用 | 整形数组与集合的排序

本文已收录于专栏&#x1f338;《Java入门一百练》&#x1f338;学习指引序、专栏前言一.sort函数二、【例题1】1、题目描述2、解题思路3、模板代码4、代码解析二、【例题1】1、题目描述2、解题思路3、模板代码4、代码解析三、推荐专栏序、专栏前言 本专栏开启&#xff0c;目的…...

LeetCode第334场周赛

2023.2.26LeetCode第334场周赛 A. 左右元素和的差值 思路 前缀和后缀和 代码 class Solution { public:vector<int> leftRigthDifference(vector<int>& nums) {int n nums.size();vector<int> l(n), r(n), ans(n);for (int i 1; i < n; i )l[…...

基于深度学习的三维重建网络PatchMatchNet(三):PatchMatchNet配置及代码主要运行流程

目录 1.PatchMatchNet环境配置 2. PatchMatchNet的大致执行流程(eval.py) 2.1 深度图的保存...

【一天一门编程语言】设计一门编程语言,给出基础语法代码示例,SDK设计。

文章目录设计一门编程语言&#xff0c;给出基础语法代码示例&#xff0c;SDK设计。一、编程语言设计1.1 语言名称1.2 数据类型1.3 基本运算符1.4 控制语句二、SDK设计2.1 基础库2.2 第三方库三、例子用 Mango 这门语言实现斐波那契数列。基础语法代码示例SDK 设计使用 Mango 语…...

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…...

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…...

手游刚开服就被攻击怎么办?如何防御DDoS?

开服初期是手游最脆弱的阶段&#xff0c;极易成为DDoS攻击的目标。一旦遭遇攻击&#xff0c;可能导致服务器瘫痪、玩家流失&#xff0c;甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案&#xff0c;帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...

智慧医疗能源事业线深度画像分析(上)

引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言&#xff1a; 通过AI视觉技术&#xff0c;为船厂提供全面的安全监控解决方案&#xff0c;涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面&#xff0c;能够实现对应负责人反馈机制&#xff0c;并最终实现数据的统计报表。提升船厂…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

【Zephyr 系列 10】实战项目:打造一个蓝牙传感器终端 + 网关系统(完整架构与全栈实现)

🧠关键词:Zephyr、BLE、终端、网关、广播、连接、传感器、数据采集、低功耗、系统集成 📌目标读者:希望基于 Zephyr 构建 BLE 系统架构、实现终端与网关协作、具备产品交付能力的开发者 📊篇幅字数:约 5200 字 ✨ 项目总览 在物联网实际项目中,**“终端 + 网关”**是…...