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

news2024/11/26 11:26:57

前言: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);//输出30
    return 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。

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

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

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

相关文章

HTTPServer改进思路1

Nginx源码思考项目改进 架构模式 事件驱动架构(EDA&#xff09;用于处理大量并发连接和IO操作 优点&#xff1a;高效处理大量并发请求&#xff0c;减少线程切换和阻塞调用技术实现&#xff1a;直接使用EPOLL&#xff0c;参考Node.js的http服务器 网络通信 协议&#xff1a;HTT…

day6 io线程

获取终端输入的字符

记录 cocos 开发问题 ,微信 wx.xxx函数 报找不到名称“wx”

今天写微信排行榜遇到 问题分享一下。 目前&#xff0c;微信、百度 和 抖音 小游戏这些平台为了保护其社交关系链数据&#xff0c;增加了 开放数据域 的概念&#xff0c;这是一个单独的游戏执行环境。开放数据域中的资源、引擎、程序&#xff0c;都和主游戏&#xff08;主域&a…

【2】Spring Cloud 工程搭建

&#x1f3a5; 个人主页&#xff1a;Dikz12&#x1f525;个人专栏&#xff1a;Spring Cloud实战&#x1f4d5;格言&#xff1a;吾愚多不敏&#xff0c;而愿加学欢迎大家&#x1f44d;点赞✍评论⭐收藏 目录 1.声明项目依赖和项目构建插件 2.完善子项目订单服务 2.1完善启动…

[Spring] Spring配置文件

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

Spring推出Spring AI框架,看看怎么个事

文章目录 概述SpringAI介绍Spring AI 提供以下功能支持的聊天模型有哪些支持的文生图的模型有哪些支持的音频到文本模型支持的嵌入模型有哪些支持的矢量数据库有哪些 概述 在当今快速发展的技术时代&#xff0c;人工智能&#xff08;AI&#xff09;已经成为各行各业的关键驱动…

Linux——awk操作符

[rootlocalhost ~] # awk BEGIN{x2;y3;print x**y,x^y,x*y,x/y,xy,x-y,x%y} 8 8 6 0 .666667 5 -1 2 赋值运算符 条件运算符 awk 中的条件运算符只有一个&#xff0c;其语法如下&#xff1a; expression?value1:value2 这是一个三目运算符&#xff0c;当表达式 expre…

#三元运算符(python/java/c)

引入&#xff1a;什么是三元运算符呢&#xff1f;无疑其操作元有三个&#xff0c;一个是条件表达式&#xff0c;剩余两个为值&#xff0c;条件表达式为真时运算取第一个值&#xff0c;为假时取第二个值。 一 Python true_expression if condition else false_expressi…

网络通讯实验报告

拓扑图 需求 1、通过DHCP服务&#xff0c;给PC4和PC5分配IP地址、网关、掩码、DNS服务器IP地址 2、Client-1要求手工配置IP地址&#xff0c;为192.168.1.1, c 3、telnet客户端可以远程登录telnet服务器进行设备管理&#xff0c;并成功修改telnet服务器的名字为123 &#xff0c…

两轮差速拖动机械臂瞄准接收口目标

下图所示&#xff0c;关节2为无动力旋转关节&#xff0c;关节4为无动力移动关节&#xff0c;关节5为旋转关节&#xff0c;差速轮可绕轮中心点4自由旋转&#xff0c;差速轮带动2和4关节运动。设计差速轮和机械臂解算方法&#xff0c;使其相互配合到达接收口&#xff0c;瞄准目标…

树上前缀和树状数组结合

怎么去分析这个题目&#xff0c;一开始我想的就是暴力dfs&#xff0c;接着枚举删除的节点&#xff0c;但是只过了百分之四十个点&#xff0c;代码如下&#xff1a;(这个代码有点像树形dp&#xff09; #include<bits/stdc.h> using namespace std;#define int long long c…

SHL笔试测评题型题库大揭秘适用公司通过技巧神助攻

⭕SHL题库外企应用的比较多&#xff0c;整体来看分为三类。 ✅第一类是综合能力&#xff0c;考察综合素质&#xff0c;要求36分钟完成24道题&#xff0c;适用范围最广。题型有安排时间问题、比例题、记忆题、排序题、日历题、图形变换题、图形推理题、拖线条题等等&#xff0c…

Linux_生产消费者模型

目录 1、生产消费者模型示意图 2、生产者消费者之间的关系 3、定义交易场所 4、实现生产消费者模型 5、伪唤醒 6、多生产多消费者的实际运用 7、POSIX信号量 7.1 初始化信号量 7.2 销毁信号量 7.3 等待信号量 7.4 发布信号量 8、生产消费的环形队列模型 8.1…

接口测试之测试原则、测试用例、测试流程详解

&#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、接口的介绍 软件测试中&#xff0c;常说的接口有两种&#xff1a;图形用户接口&#xff08;GUI&#xff0c;人与程序的接口&#xff09;、应用程序编程接口&…

AWS云服务器购买:亚马逊云服务器的价格真的那么贵吗?一年要花多少钱?

亚马逊云服务器是全球领先的云计算服务提供商之一&#xff0c;其服务覆盖全球多个地区&#xff0c;拥有众多的客户和合作伙伴。然而&#xff0c;对于很多人来说&#xff0c;AWS的价格一直是一个热门话题。那么&#xff0c;亚马逊云服务器的价格真的那么贵吗&#xff1f;一年要花…

python爬虫Selenium模块及测试案例详解

什么是selenium&#xff1f; &#xff08;1&#xff09;Selenium是一个用于Web应用程序测试的工具。 &#xff08;2&#xff09;Selenium 测试直接运行在浏览器中&#xff0c;就像真正的用户在操作一样。 &#xff08;3&#xff09;支持通过各种driver&#xff08;FirfoxDrive…

粘包问题、mmap和分片上传

一、粘包问题&#xff1a; 如果一端要把文件发给另一端&#xff0c;要发送两个部分的数据&#xff1a;其一是文件名&#xff0c;用于对端创建文件&#xff1b;另一个部分是文件内容。服务端在接收文件名&#xff0c;实际上并不知道有多长&#xff0c; 所以它会试图把网络缓冲区…

怎么把照片变漫画?学会这几招让照片秒变漫画

在这个追求图片创意与趣味性的时代&#xff0c;照片的“变身”游戏正悄然风靡。 从滤镜的巧妙运用到拍摄姿势的创新突破&#xff0c;人们不断探索着让照片焕发新生的无限可能。 而今&#xff0c;一股将照片转化为漫画风格的新潮流正席卷而来&#xff0c;它不仅保留了照片的记…

【PPT方案】大数据湖建设方案

背 景&#xff1a;大数据湖的发展背景与建设理念 体 系&#xff1a;大数据湖体系规划与建设思路 生态圈&#xff1a;探索新兴业务入湖建设模式 共 享&#xff1a;大数据湖统一访问共享规划 运 营&#xff1a;大数据湖一体化运营管理建设 软件全套资料部分文档清单&…

恐怖数字暗影:猜中才能逃离

大家可以看看这个&#xff0c;也很有意思&#xff01; 猜数字游戏&#xff08;老六版&#xff09;-CSDN博客 1、 剧情介绍 在一个阴暗潮湿的古堡中&#xff0c;你独自一人走进了一间散发着诡异气息的房间。房间的正中央有一张古老的桌子&#xff0c;上面放着一本泛黄的羊皮卷…