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

C语言·函数(超详细系列·全面总结)

前言:Hello大家好😘,我是心跳sy,为了更好地形成一个学习c语言的体系,最近将会更新关于c语言语法基础的知识,今天更新一下函数的知识点,我们一起来看看吧!  

目录

一、函数是什么 💫

二、C语言中函数的分类 💫

1、⭐️库函数⭐️

 2.1、🌈库函数的使用

 2.2、🌈常用的库函数

2、⭐️自定义函数⭐️

三、函数的组成 💫

1、⭐️函数的基本组成⭐️

2、⭐️函数的参数⭐️

2.1、🌈实际参数(实参)

2.2、🌈形式参数(形参)

2.3、🌈实参与形参的匹配

3、⭐️函数的声明和定义⭐️

3.1、🌈函数声明

3.2、🌈函数的定义

四、函数的调用 💫

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

1、⭐️嵌套调用⭐️

2、⭐️链式访问⭐️

六、函数递归 💫

1、⭐️什么是递归?⭐️

2、⭐️递归的两个必要条件⭐️

3、⭐️递归的基本原理⭐️

4、⭐️递归实例⭐️


💞心跳sy的C语言专栏💞⏪C语言知识点汇总到这了,有兴趣的友友可以订阅看看哟~

一、函数是什么 💫

👉在C语言中,函数是一段完成特定任务的代码块,它可以被多次调用,接受输入参数并可选地返回一个值;函数是结构化编程的基础,允许程序员将一个大问题分解为多个小问题,每个小问题由一个函数来封装,这种方式提高了代码的可读性、可维护性和可重用性。

二、C语言中函数的分类 💫

1、⭐️库函数⭐️

⭕️C语言库函数是指在C语言标准库中预先定义好的函数,这些函数包含在相应的头文件里,每个函数都有其函数名、返回值类型和函数参数;这些函数用于执行常见的任务,例如输入输出、字符串处理、内存操作等。

⭕️C语言标准库是一组标准化的函数和工具,旨在为C语言程序员提供基本的编程支持。库函数通常以源代码形式或预编译形式提供,可以直接在C程序中使用,而无需从零开始编写这些功能的代码;以下情况使用的函数都属于库函数:

🔶比如我们想把程序结果打印到屏幕上看看,会频繁的使用一个功能:将信息按照一定的格式打印到屏幕上(printf)。

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

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

2.1、🌈库函数的使用

👉要在C程序中使用库函数,首先需要包含相应的头文件。例如,使用 printf 函数需要在程序顶部添加以下代码:

#include <stdio.h>

👉然后,就可以在程序中调用 printf 函数了:

int main() {printf("Hello, World!\n");return 0;
}

 2.2、🌈常用的库函数

🎀简单的总结,C语言常用的库函数都有:

🔸IO函数

🔸字符串操作函数

🔸字符操作函数

🔸内存操作函数

🔸时间/日期函数

🔸数学函数

🔸其他库函数

🍀因为具体的函数太多了,这里不一一列举了,我们在日常学习中,需要养成查询库函数使用方法的习惯哦,这里分享一个查询库函数的网站:👉http://en.cppreference.com(英文版)

2、⭐️自定义函数⭐️

❓如果库函数能干所有的事情,那还要程序员干什么?

⭕️所以更加重要的是自定义函数;自定义函数和库函数一样,有函数名,返回值类型和函数参数,但是与库函数不一样的是这些都是我们自己来设计,这就给程序员了一个很大的发挥空间。

👉我们来看一个自定义的函数实现找出两个整数中的最大值:

#include <stdio.h>
//get_max函数的设计int get_max(int x, int y)
{return (x>y)?(x):(y);
}int main()
{int num1 = 10;int num2 = 20;int max = get_max(num1, num2);printf("max = %d\n", max);return 0;
}

👉其中 get_max 就是我们自己定义的函数,用于实现求两整数最大值的算法,并在主函数中调用,用 max 来接收返回值。 

三、函数的组成 💫

1、⭐️函数的基本组成⭐️

👉一个C语言函数通常由以下几个部分组成:

💠返回类型:指定函数返回的数据类型。如果函数不返回任何值,则使用 void 。

💠函数名:函数的名称,用于调用该函数。

💠参数列表:一组定义在圆括号内的参数,用于接受调用者传递给函数的数据。参数可以是多种数据类型,甚至是其他函数。

💠函数体:包含在花括号 { } 中的代码块,这里包含了函数执行的具体逻辑。

⭕️其中返回类型指定了函数执行完毕后返回的数据类型,可以是整型、字符型、各种指针类型等,如果函数不返回任何值,则使用 void。例如,int 表示函数返回一个整数,void 表示函数不返回任何值。

⭕️函数名是函数的标识符,用于在程序中调用该函数。我们在写函数时,函数名应该清晰地反映函数的目的或行为。

👉下面具体讲解如何使用函数:

2、⭐️函数的参数⭐️

2.1、🌈实际参数(实参)

❓什么是实参?

⭕️真实传给函数的参数,叫实参

⭕️实参可以是:常量、变量、表达式、函数等;

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

int main() {int years = 30;char* person = "Alice";printMessage(years, person); // 函数调用,years 和 person 是实参return 0;
}

在这个例子中,years 和 person 就是实参。

2.2、🌈形式参数(形参)

⭕️形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内 存单元),所以叫形式参数。

⭕️形式参数当函数调用完成之后就自动销毁了,因此形式参数只在函数中有效。

⭕️在函数定义时,形参由它们的类型和名称组成,例如:

void printMessage(int age, char* name) {printf("Name: %s, Age: %d\n", name, age);
}

在这个例子中,age 和 name 就是形参。

2.3、🌈实参与形参的匹配

⭕️在函数调用时,C语言编译器会检查实参与形参的类型和数量是否匹配。如果实参与形参的类型和数量不匹配,可能会导致编译错误或运行时错误。

👉例如,以下代码将导致编译错误,因为printMessage 函数期望两个参数,但只提供了一个:

printMessage("Bob"); // 编译错误:缺少参数

3、⭐️函数的声明和定义⭐️

3.1、🌈函数声明

🔶在调用函数之前,必须声明函数。函数声明定义了函数的接口,使得函数可以在其他部分被调用,它通常放在程序的顶部或头文件中,包括函数名、返回类型和参数列表。

👉例如:

int add(int a, int b); // 声明一个返回int类型,接受两个int参数的函数

3.2、🌈函数的定义

🔶函数定义是函数的实际实现,它包括函数声明的所有部分,再加上函数体(函数体是一组语句,它们定义了当函数被调用时执行的操作)例如:

int add(int a, int b) { // 函数定义int result = a + b;return result;
}

四、函数的调用 💫

🔶函数调用是执行函数的过程。要调用一个函数,只需使用函数名并提供必要的参数(如果函数有参数的话)。例如:

int sum = add(3, 5); // 调用add函数,并将返回值赋给sum变量

👉完整的调用如下: 

#include <stdio.h>// 函数声明
int add(int a, int b);// 函数定义
int add(int a, int b)
{int sum = a + b;return sum;
}int main() 
{int result = add(10, 20); // 函数调用printf("Result: %d\n", result);//输出30return 0;
}

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

1、⭐️嵌套调用⭐️

#include <stdio.h>void new_line()
{printf("hehe\n");
}void three_line()
{int i = 0;for(i=0; i<3; i++){new_line();//继续调用}
}int main()
{three_line();return 0;
}

🔴注意:函数可以嵌套调用,但是不能嵌套定义

2、⭐️链式访问⭐️

⭕函数链式访问(也称为函数链式调用)是一种编程技巧,是把一个函数的返回值作为另外一个函数的参数来调用。

​
#include <stdio.h>
#include <string.h>int main()
{char arr[20] = "hello";int ret = strlen(strcat(arr,"bit"));//求字符串长度printf("%d\n", ret);return 0;
}​

六、函数递归 💫

1、⭐️什么是递归?⭐️

程序调用自身的编程技巧称为递归( recursion);函数递归是指函数在执行过程中调用自身的一种技术。

2、⭐️递归的两个必要条件⭐️

⭕递归函数通常包含两部分:基线条件和递归条件;

⭕基线条件是递归函数停止递归的条件,而递归条件是递归函数继续调用自身的条件。递归是一种强大的编程技术,它可以使代码更简洁、更优雅,但需要小心使用,以避免无限递归导致的栈溢出等问题。

3、⭐️递归的基本原理⭐️

⭕递归函数通过反复调用自身来解决问题,每次调用时问题规模都会减小,直到达到基线条件,递归停止。递归函数在调用自身时,会创建一个新的函数栈帧,用于存储局部变量和参数。当递归结束时,这些栈帧会依次弹出,恢复到最初的调用状态。

4、⭐️递归实例⭐️

👉 计算阶乘:

#include <stdio.h>// 递归函数:计算阶乘
int factorial(int n) 
{// 基线条件if (n == 0){return 1;}// 递归条件else {return n * factorial(n - 1);}
}int main() 
{int num = 5;int result = factorial(num);printf("%d! = %d\n", num, result);return 0;
}

⭕factorial 函数是一个递归函数,它计算并返回一个整数的阶乘。当 n 等于0时,函数返回1,这是基线条件。否则,函数调用自身,并返回 n 乘以 factorial (n-1) 的结果 

🔶当调用 factorial(5) 时,以下是函数调用的过程:

🔸第一次调用factorial(5) 因为 n 不等于0,所以执行 return 5* factorial(4) ,这次调用会暂停,等待 factorial(4) 的结果。

🔸第二次调用factorial(4) n 不等于0,执行 return 4* factorial(3) ,这次调用会暂停,等待factorial(3) 的结果

🔸如此下去直到第六次调用,factorial(0), n 等于0,所以触发基线条件,返回1。

🔷当 factorial(0) 返回1时,递归调用开始依次返回:

🔹第五次调用返回factorial(1),返回 1*1=1

🔹第四次调用返回factorial(2),返回 2*1=2

🔹第三次调用返回factorial(3),返回 3*2=6

🔹第二次调用返回factorial(4),返回 4*6=24

🔹第一次调用返回factorial(5),返回 5*24=120

👉最终得出5的阶乘为120。

函数篇到此结束💞💞💞感谢大家花费宝贵的时间阅读本文章,制作不易,希望大家多多支持呀😘😘😘,如有任何问题欢迎各位大佬在评论区批评指正!!!

相关文章:

C语言·函数(超详细系列·全面总结)

前言&#xff1a;Hello大家好&#x1f618;&#xff0c;我是心跳sy&#xff0c;为了更好地形成一个学习c语言的体系&#xff0c;最近将会更新关于c语言语法基础的知识&#xff0c;今天更新一下函数的知识点&#xff0c;我们一起来看看吧&#xff01; 目录 一、函数是什么 &a…...

Windows及Linux系统加固

君衍. 一、Windows加固1、配置简介2、账户配置3、本地配置4、安全设置 二、Linux加固1、配置简介2、网络配置3、日志和审计配置4、访问认证和授权配置5、系统运维配置 一、Windows加固 1、配置简介 通常在Windows安全配置中有两类对象 一类是Windows Server&#xff0c;如win …...

Postman安装使用教程(详解)

目录 一、Postman是什么 二、安装系统要求 三、下载Postman 四、注册和登录Postman 五、创建工作空间 六、创建请求 一、Postman是什么 在安装之前&#xff0c;让我们先来简单了解一下Postman。Postman是一个流行的API开发工具&#xff0c;它提供了友好的用户界面用于发送…...

【嵌入式开发之标准I/O】文件I/O的基本概念,打开、关闭、定位函数及实例

文件I/O和标准I/O 什么是文件I/O?什么是标准I/O? 文件I/O&#xff1a;文件I/O又称系统IO&#xff0c;系统调用&#xff0c;称之为不带缓存的IO&#xff08;unbuffered I/O)。是操作系统提供的API接口函数。不带缓存指的是每个read&#xff0c;write都调用内核中的一个系统调…...

C++文件操作-文本文件-读文件

第一种 #include<iostream>//1、包含头文件 fstream #include<fstream> using namespace std;void test01() {//2、创建流对象ifstream ifs;//3、打开文件 并且判断是否打开成功ifs.open("test.txt", ios::in);if (!ifs.is_open()){cout << "…...

二叉树精选面试题

&#x1f48e; 欢迎大家互三&#xff1a;2的n次方_ 1. 相同的树 100. 相同的树 同时遍历两棵树 判断结构相同&#xff1a;也就是在遍历的过程中&#xff0c;如果有一个节点为null&#xff0c;另一棵树的节点不为null&#xff0c;那么结构就不相同 判断值相同&#xff1a;只需…...

如何在 Android 中删除和恢复照片

对于智能手机用户来说&#xff0c;相机几乎已经成为一种条件反射&#xff1a;你看到值得注意的东西&#xff0c;就拍下来&#xff0c;然后永远保留这段记忆。但如果那张照片不值得永远保留怎么办&#xff1f;众所周知&#xff0c;纸质快照拿在手里很难舍弃&#xff0c;而 Andro…...

HarmonyOS Next原生应用开发-从TS到ArkTS的适配规则(六)

一、仅支持一个静态块 规则&#xff1a;arkts-no-multiple-static-blocks 级别&#xff1a;错误 ArkTS不允许类中有多个静态块&#xff0c;如果存在多个静态块语句&#xff0c;请合并到一个静态块中。 TypeScript class C {static s: stringstatic {C.s aa}static {C.s C.s …...

功能测试与APPSCAN自动化测试结合的提高效率测试策略

背景 手工探索性测试&#xff08;Manual Exploratory Testing&#xff0c;简称MET&#xff09;是一种软件测试方法&#xff0c;它依赖于测试人员的直觉、经验和即兴发挥来探索应用程序或系统。与传统的脚本化测试相比&#xff0c;手工探索性测试不遵循固定的测试脚本&#xff0…...

AVL树的理解和实现[C++]

文章目录 AVL树AVL树的规则或原理 AVL树的实现1.节点的定义2.功能和接口等的实现默认构造函数&#xff0c;析构函数拷贝构造函数插入搜索打印函数检查是否为平衡树&#xff0c;检查平衡因子旋转 AVL树 AVL树&#xff0c;全称Adelson-Velsky和Landis树&#xff0c;是一种自平衡…...

云计算遭遇的主要安全威胁

以下是详细说明云计算遭遇的所有主要安全威胁&#xff1a; 1. 数据泄露 描述&#xff1a;数据泄露是指未经授权的情况下访问和获取敏感数据。云计算环境中的数据泄露通常由于不安全的配置、软件漏洞或内部威胁造成。 案例&#xff1a; Capital One数据泄露&#xff1a;2019…...

[MySQL]02 存储引擎与索引,锁机制,SQL优化

Mysql存储引擎 可插拔式存储引擎 索引是在存储引擎底层上实现的 inno DB MySQL默认存储引擎: inno DB高可靠性和高性能的存储引擎 DML操作遵循ACID模型支持事务行级锁,提高并发访问性能支持外键 约束,保证数据完整性和可靠性 MySAM MySAM是MySQL的早期引擎 特点: 不支持事…...

ld,GNU 链接器介绍以及命令行参数详解

ld&#xff0c;GNU 链接器介绍以及命令行参数详解 当我们使用GCC编译源代码生成可执行程序&#xff0c;经过预处理、汇编、编译、链接四个阶段。 链接器&#xff08;Linker&#xff09;将多个目标文件和库文件链接起来&#xff0c;链接器还解决目标文件之间的符号引用&#xff…...

[web]-反序列化-base64

看到源码 <?php error_reporting(0); class A {public $contents "hello ctfer";function __toString(){if ((preg_match(/^[a-z]/i,$this->contents))) {system("echo $this->contents");return 111;}else{return "...";}} }functi…...

【医学影像】RK3588+FPGA:满足远程诊疗系统8K音视频编解码及高效传输需求

医学影像 提供基于Intel平台、NXP平台、Rockchip平台的核心板、Mini-ITX主板、PICO-ITX主板以及工业整机等计算机硬件。产品板载内存&#xff0c;集成超高清编码/解码视频引擎&#xff0c;具有出色的数据处理能力和图形处理能力&#xff0c;功能高集成&#xff0c;可应用于超声…...

昇思25天学习打卡营第16天|基于MindSpore通过GPT实现情感分类

文章目录 昇思MindSpore应用实践1、基于MindSpore通过GPT实现情感分类GPT 模型&#xff08;Generative Pre-Training&#xff09;简介imdb影评数据集情感分类 2、Tokenizer导入预训练好的GPT3、基于预训练的GPT微调实现情感分类 Reference 昇思MindSpore应用实践 本系列文章主…...

服务器借助笔记本热点WIFI上网

一、同一局域网环境 1、当前环境&#xff0c;已有交换机组网环境&#xff0c;服务器已配置IP信息。 设备ip服务器125.10.100.12交换机125.10.100.0/24笔记本125.10.100.39 2、拓扑图 #mermaid-svg-D4moqMym9i0eeRBm {font-family:"trebuchet ms",verdana,arial,sa…...

开发实战中Git的常用操作

Git基础操作 1.初始化仓库 git init解释&#xff1a;在当前目录中初始化一个新的Git仓库。 2.克隆远程仓库 git clone <repository-url>解释&#xff1a;从远程仓库克隆一个完整的Git仓库到本地。 3.检查当前状态 git status解释&#xff1a;查看当前工作目录的状态…...

python调用chrome浏览器自动化如何选择元素

功能描述&#xff1a;在对话框输入文字&#xff0c;并发送。 注意&#xff1a; # 定位到多行文本输入框并输入内容。在selenium 4版本中&#xff0c;元素定位需要填写父元素和子元素名。 textarea driver.find_element(By.CSS_SELECTOR,textarea.el-textarea__inner) from …...

深入理解JS中的排序

在JavaScript开发中,排序是一项基础而重要的操作。本文将探讨JavaScript中几种常见的排序算法,包括它们的原理、实现方式以及适用场景。 1、冒泡排序 1.1、原理 通过比较相邻两个数的大小,交换位置排序:如果后一个数比前一个数小,则交换两个数的位置,重复这个过程,直…...

Kafka之存储设计

文章目录 1. 分区和副本的存储结构1. 分区和副本的分布2. 存储目录结构3. 文件描述 2. 相关配置3. 数据文件类型4. 数据定位原理LogSegment 类UnifiedLog 类 5. 副本数据同步HW水位线LEO末端偏移量HW更新原理 6. 数据清除 1. 分区和副本的存储结构 在一个多 broker 的 Kafka 集…...

Python面试整理-Python中的函数定义和调用

在Python中,函数是一种封装代码的方式,使得代码模块化和复用性更强。定义和调用函数是Python编程中的基本技能。以下是关于如何在Python中定义和调用函数的详细介绍: 函数定义 函数在Python中使用def关键字进行定义。函数体开始前,通常有一个可选的文档字符串(docstring)…...

HTTP协议、Wireshark抓包工具、json解析、天气爬虫

HTTP超文本传输协议 HTTP&#xff08;Hyper Text Transfer Protocol&#xff09;&#xff1a; 全称超文本传输协议&#xff0c;是用于从万维网&#xff08;WWW:World Wide Web &#xff09;服务器传输超文本到本地浏览器的传送协议。 HTTP 协议的重要特点&#xff1a; 一发一收…...

electron项目中实现视频下载保存到本地

第一种方式&#xff1a;用户自定义选择下载地址位置 渲染进程 // 渲染进程// 引入 import { ipcRenderer } from "electron";// 列表行数据下载视频操作&#xff0c;diffVideoUrl 是视频请求地址 handleDownloadClick(row) {if (!row.diffVideoUrl) {this.$message…...

基于chrome插件的企业应用

一、chrome插件技术介绍 1、chrome插件组件介绍 名称 职责 访问权限 DOM访问情况 popup 弹窗页面。即打开形式是通过点击在浏览器右上方的icon&#xff0c;一个弹窗的形式。 注: 展示维度 browser_action:所有页面 page_action:指定页面 可访问绝大部分api 不可以 bac…...

unittest框架和pytest框架区别及示例

unittest框架和pytest框架区别及示例 类型unittest框架pytest框架unittest框架示例pytest框架示例安装python内置的一个单元测试框架,标准库&#xff0c;不需要安装第三方单元测试库&#xff0c;需要安装使用时直接引用 import unittest安装命令&#xff1a;pip3 install pyte…...

IDEA性能优化方法解决卡顿

文章目录 前言一、可以采取以下措施&#xff1a;二、VM Options的参数解释1. 内存设置2. 性能调优3. GC&#xff08;垃圾回收&#xff09;调优4. 调试和诊断5. 其它设置6.设置 VM Options 的步骤&#xff1a; 总结 前言 我们在使用 IntelliJ IDEA的时候有时候会觉得卡顿&#x…...

Mysql集合转多行

mysql 集合转多行 SELECT substring_index(substring_index(t1.group_ids, ,, n), ,, -1) AS group_id FROM (select 908,909 as group_ids ) t1, (SELECT rownum : rownum 1 AS n FROM ( SELECT rownum : 0 ) r, orders ) t2 WHERE n < ( LENGTH( t1.group_ids ) - LENGT…...

MFC:只允许产生一个应用程序实例的具体实现

在MFC&#xff08;Microsoft Foundation Class&#xff09;应用程序中&#xff0c;如果你想限制只允许产生一个应用程序实例&#xff0c;通常会使用互斥体&#xff08;Mutex&#xff09;来实现。这可以确保如果用户尝试启动第二个实例时&#xff0c;它会被阻止或将焦点返回到已…...

深入理解TCP/IP协议中的三次握手

&#x1f44d; 个人网站&#xff1a;【洛秋资源小站】 深入理解TCP/IP协议中的三次握手 在计算机网络中&#xff0c;TCP/IP协议是通信的基石。理解TCP/IP协议中的三次握手是掌握网络通信的关键步骤之一。本文将详细解释TCP/IP协议中的三次握手过程&#xff0c;探讨其工作原理&…...

一个新网站怎么做seo/360推广登录入口官网

win7系统使用久了&#xff0c;好多网友反馈说win7系统共享虚拟机提示VMware Workstation Server共享服务不能启动的问题&#xff0c;非常不方便。有什么办法可以永久解决win7系统共享虚拟机提示VMware Workstation Server共享服务不能启动的问题&#xff0c;面对win7系统共享虚…...

建立https网站/seo优化推荐

/Files/xiangboren/慧聪网电话采集系统.rar 里边用到一个DLL OverredGatherCom.dll 感谢原作者。 输入 如&#xff1a;http://www.search.hc360.com/cgi-bin/seinterface.cgi?word%BC%C3%C4%CF&ind&price&dt7&class%C6%F3%D2%B5%BF%E2 的采集列表开始开采集&a…...

新疆生产建设兵团编办网站/在线生成网页网站

Window 产品密钥 2019.4.2 测试可用 window2003 DF74D-TWR86-D3F4V-M8D8J-WTT7Mposted 2019-04-02 13:13 Bypass 阅读(...) 评论(...) 编辑 收藏...

空间站对接/网站seo推广多少钱

如果你只做自己能力范围之内的事情,就永远没法进步。 2017/3/4 更新中。。。转载于:https://www.cnblogs.com/qidaiymm/p/6501607.html...

外包做网站公司有哪些/百度竞价渠道代理商

缓存三大问题再总结 1、缓存穿透 定义&#xff1a;缓存穿透是指查询一个一定不存在的数据&#xff0c;由于缓存是不命中时需要从数据库查询&#xff0c;查不到数据则不写入缓存&#xff0c;这将导致这个不存在的数据每次请求都要到数据库去查询&#xff0c;进而给DB带来压力。 …...

做网站学好哪些软件/sem和seo的区别

保护模式&#xff08;二&#xff09;——分段机制&#xff0c;系统门 分段机制 分段机制是历史遗留&#xff0c;实际使用的时候尽量不使用&#xff0c;建议少花时间 BASE:OFFSET表示一个地址。BASE、OFFSET都是16位&#xff0c;若将其当作高位、低位地址&#xff0c;能表示4…...