【C语言】函数

前言

函数的定义:子程序(函数的基本单位)

  • 函数是一段封装了特定功能的可重复使用的代码块。它可以接受输入参数,执行特定的操作或任务,并返回一个值或者不返回任何值;
  • 有一个或多个语句块组成,而且具备相对的独立性。
  • 函数由函数头和函数体组成。函数头包括函数的返回类型、函数名和参数列表。函数体包含了实现函数功能的代码。
  • 函数的主要作用是提高代码的可读性、可维护性和可重用性。通过将代码封装在函数中,可以将复杂的任务分解为多个简单的步骤,使得代码更易于理解和调试。函数还可以被多次调用,避免了重复编写相同的代码,提高了代码的重用性。
  • 在程序中,函数可以被其他函数调用,也可以被自身递归调用。函数可以接受输入参数,通过参数传递数据给函数;函数也可以返回一个值,将计算结果返回给调用者。
  • 函数在编程语言中扮演着重要的角色,是程序的基本组成单元。常见的编程语言如C、C++、Java、Python等都支持函数的定义和使用。

本文主要介绍函数的基本使用和递归


文章目录


一、C语言中函数分为两种:

1、库函数

1.1、为什么会有库函数?
  • 1.我们知道在我们学习语言编程的时候,总是在一个代码编写完成之后迫不及待的想知道结果,想把这个结果打印到我们的屏幕上看看。这个时候我们会频繁的使用一个功能:将信息按照一定的格式打印到屏幕上(printf)。
  • 2.在编程的过程中我们会频繁的做一些字符串的拷贝工作( strcpy )
  • 3.在编程是我们也计算,总是会计算n的k次方这样的运算(pow)

像上面我们描述的基础功能,它们不是业务性的代码。我们在开发的过程中每个程序员都可能用的到为了支持可移植性和提高程序的效率,所以C语言的基础库中提供了一系列类似的库函数,方便程序员进行软件开发。

1.2、可以查找库函数的文档链接:
1.3、C语言常见的库函数有:
  • l0函数:                                     printf    scanf    getchar    putchar
  • 字符串操作函数:                      strcmp   strlen
  • 字符操作函数:                         toupper
  • 内存操作函数 :                        memcpy    memcmp   memset
  • 时间/日期函数:                        time
  • 数学函数:                                sqrt    pow
  • 其他库函数~~

1.4、函数的格式:

2、自定义函数

2.1、为什么有了库函数还要有自定义函数?

尽管标准库函数提供了许多常用的功能,但在实际的软件开发中,有时候仍然需要编写自定义函数。以下是一些原因:

  • 1. 封装复杂逻辑:自定义函数可以将复杂的逻辑封装在一个函数中,使得代码更加清晰、易于理解和维护。通过将一系列操作封装在一个函数中,可以提高代码的可读性和可维护性。
  • 2. 代码复用:自定义函数可以被多次调用,避免了重复编写相同的代码。通过将一段重复使用的代码封装在一个函数中,可以提高代码的重用性,减少代码冗余,同时也方便后续的维护和修改。
  • 3. 模块化设计:自定义函数可以将程序分解为多个模块,每个模块负责不同的功能。这样可以使代码更加结构化,易于管理和维护。不同的模块可以通过函数调用的方式进行交互,提高了代码的可扩展性和可维护性。
  • 4. 解决特定问题:有时候需要解决一些特定的问题,而标准库函数可能无法完全满足需求。在这种情况下,编写自定义函数可以根据具体需求来实现特定的功能。
  • 5. 提高性能:自定义函数可以根据具体情况进行优化,以提高程序的性能。通过对算法和数据结构的优化,可以使程序更加高效。

总而言之,自定义函数可以根据具体需求来实现特定的功能,提高代码的可读性、可维护性和可重用性。标准库函数提供了一些常用的功能,但并不一定能满足所有的需求,因此在实际开发中,编写自定义函数是非常常见和必要的。这给程序员一个很大的发挥空间。

2.2、函数的格式:

注:自定义函数和库函数一样,有函数名,返回值类型和函数参数。但是不一样的是这些都是我们自己来设计;自定义函数内生机制是如何进行逻辑运算的就全靠自定义;在main主程序中返回类型需要指定一个名称或是变量用于存放函数名,如:

int max = get_max( a, b ); //这里的max就是用于存放get_max

二、函数参数

1、实际参数(实参):

在C语言中,实际参数是在函数调用时,传递给函数形式参数的具体值。实际参数可以是常量、变量、表达式或函数的返回值。函数调用的语法,是通过函数名后跟一对小括号来实现的。在小括号中,可以按照位置顺序传递实际参数给函数,也可以使用关键字参数来指定参数的名称和值。

  • 例如,考虑以下函数定义:
  • int add_numbers(int x, int y) 
    {
        return x + y;
    }
    
  • 在调用这个函数时,可以传递实际参数给形式参数:
  • int result = add_numbers(5, 3);//把5和3传个形式参数
    
  • 在这个例子中,实际参数 5 和 3 被传递给形式参数 x 和 y,函数将返回它们的和 8。
  • 实际参数的值可以是任何合法的表达式,比如变量、常量或函数的返回值。例如:
  • int a = 2;
    int b = 3;
    int result = add_numbers(a + 1, b * 2);
    
  • 在这个例子中,变量 a 的值加 1 和变量 b 的值乘以 2 被作为实际参数传递给函数,函数将返回它们的和 9。

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

2、形式参数(形参):

在C语言中,形式参数(也称为函数参数或函数形参)是在函数名后括号中声明的参数,用于接收函数调用时传递的实际参数值。形式参数用于指定函数需要接收的参数类型和数量。形式参数在函数定义时声明可以指定参数的类型和名称,但不需要具体的值。当函数被调用时,实际参数的值将被传递给对应的形式参数,以便在函数体内进行操作和计算。

  • 形式参数可以分为以下几种类型:
  • 一. 位置参数:按照声明的顺序依次传递给函数。
  • 二. 关键字参数:通过指定参数名来传递值,可以不按照声明的顺序传递。
  • 三. 默认参数:在函数定义时给形式参数指定默认值,如果调用时没有传递实际参数,则使用默认值。
  • 四. 可变参数:接收不定数量的实际参数,可以是任意个数的位置参数或关键字参数。
  • 在C语言中,形式参数的声明通常包括参数类型和参数名称,如下所示:
  • return_type  function_name (parameter_type  parameter_name)
    {
        // 函数体
    }
    
  • 其中,`return_type` 是函数的返回类型`function_name` 是函数的名称`parameter_type` 是形式参数的类型`parameter_name` 是形式参数的名称
  • 例如,考虑以下函数定义:
  • int add_numbers(int x, int y)
    {
        return x + y;
    }
    
  • 在这个例子中,`int x` 和 `int y` 是形式参数,它们的类型分别为 `int`,名称分别为 `x` 和 `y`。函数被调用时,实际参数的值将被传递给 `x` 和 `y`,并在函数体内进行操作。
  • 可以通过位置参数的方式传递实际参数给形式参数:
  • int result = add_numbers(5, 3);
  • 在这个例子中,实际参数 5 和 3 被传递给形式参数 x 和 y,函数将返回它们的和 8。

总之,形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了(生存期)。因此形式参数只在函数中有效。需要提到的是:形参实例化之后其实相当于实参的一份临时拷贝

关于具体的使用场景请看:

三、函数调用

1、传值调用:

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

2、传址调用:

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

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

1、嵌套调用

函数之间的有机结合起来,也就是说是相互调用,但,不能进行函数内定义函数

int wei(int x,int y,int z)
{
   //函数体
}
int wos(int x,int y,int z)
{
   int wei
   //函数体
}


int main()
{
   retinf 0;
}

2、链式访问

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

//三重链式访问
printf("%d",printf("%d",printf("%d",43))

函数的声明和定义

函数声明:

1.告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,无关紧烟

//这就可以很好的声明一个基本函数
int ABB(int ,int )

2.函数的声明一般出现在函数的使用之前。要满足先声明后使用 
3函数的声明一般要放在头文件中的,否则将会是编程器识别不到自定义函数而报错或警告,因为代码是从上到下以次扫描。

#include"dudao"
//调用时声明在此
int main()
{
    retinf 0;
}

//如果说函数存在别的文件内
int dudao(int x,int y)
{
    //函数体
}

函数定义:

函数的定义是指函数的具体实现,交待函数的功能实现,所以说函数的做用还是要靠函数定义来决定的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值