当前位置:首页 » 《休闲阅读》 » 正文

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

4 人参与  2024年09月14日 14:01  分类 : 《休闲阅读》  评论

点击全文阅读


前言: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://zhangshiyu.com/post/159801.html

<< 上一篇 下一篇 >>

  • 评论(0)
  • 赞助本站

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

关于我们 | 我要投稿 | 免责申明

Copyright © 2020-2022 ZhangShiYu.com Rights Reserved.豫ICP备2022013469号-1