【C语言初阶】函数

🌟博主主页:我是一只海绵派大星

📚专栏分类:C语言

❤️感谢大家点赞👍收藏⭐评论✍️

目录

一、函数是什么

二、库函数

C语言常用的库函数都有:

库函数的调用方法

[三、 自定义函数](#三、 自定义函数)

四、函数参数

实际参数(实参)

形式参数(形参)

分析

五、函数调用

传值调用

传址调用

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

嵌套调用

链式访问

七、函数的声明和定义

函数声明

函数定义

八、函数递归

什么是递归

递归的两个必要条件


一、函数是什么

函数是数学中的一个基本概念,它描述了一种规则或映射,将一个集合的元素映射到另一个集合的元素上。这种映射关系可以是线性的,也可以是非线性的;可以是简单的,也可以是复杂的。函数的定义域和值域可以是实数、复数、向量、矩阵等各种数学对象。在数学的世界里,函数是描述事物变化关系的重要工具。通过函数,我们可以研究变量之间的依赖关系,预测事物的发展趋势,揭示自然界的内在规律。

二、库函数

库函数是将一组常用的函数封装起来,供开发者调用的方式。这些函数通常以库文件的形式存储,可以在程序中直接调用,以实现特定的功能,从而减少代码量,提高开发效率。

C语言常用的库函数都有

  • IO函数
  • 字符串操作函数
  • 字符操作函数
  • 内存操作函数
  • 时间/日期函数
  • 数学函数
  • 其他库函数

库函数的调用方法

  1. 引入头文件:在使用库函数之前,需要在代码的头部引入相应的头文件。
  2. 函数原型:查看头文件中声明的函数原型,了解函数的参数和返回类型等信息。
  3. 函数调用:根据函数原型,在代码中调用相应的函数,并传入适当的参数。
  4. 编译链接:在编译代码时,需要链接相应的库文件。一些常用的库文件,如标准输入输出库的函数,通常会被默认链接。对于其他自定义的库函数,需要在编译时明确指定相应的库文件。

三、 自定义函数

自定义函数是一种编程技术,允许程序员根据特定需求编写自己的函数。这些函数可以在程序中多次调用,实现代码重用,提高编程效率。
函数的组成:

ret_type fun_name ( para1 , * )
{
statement ; // 语句项
}
ret_type 返回类型
fun_name 函数名
para1 函数参数

举个例子:
写一个函数可以交换两个整形变量的内容。

cpp 复制代码
void Swap2(int *px, int *py)
{
 int tmp = 0;
 tmp = *px;
 *px = *py;
 *py = tmp;
}
int main()
{
 int num1 = 1;
 int num2 = 2;
 Swap1(num1, num2);
 printf("Swap1::num1 = %d num2 = %d\n", num1, num2);
 Swap2(&num1, &num2);
 printf("Swap2::num1 = %d num2 = %d\n", num1, num2);
 return 0;
}

四、函数参数

实际参数(实参)

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

形式参数(形参)

形式参数是指函数名后括号中的变量,因为形式参数只有在函数被调用的过程中才实例化(分配内
存单元),所以叫形式参数。形式参数当函数调用完成之后就自动销毁了。因此形式参数只在函数中有效。
上面 Swap1 和 Swap2 函数中的参数 x,y,px,py 都是形式参数 。在main函数中传给 Swap1 的 num1 ,num2 和传给 Swap2 函数的 &num1 , &num2 是实际参数

分析

这里可以看到 Swap1 函数在调用的时候, x , y 拥有自己的空间,同时拥有了和实参一模一样的内容。
所以我们可以简单的认为: 形参实例化之后其实相当于实参的一份临时拷贝

五、函数调用

传值调用

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

传址调用

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

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

函数和函数之间可以根据实际的需求进行组合的,也就是互相调用的。

嵌套调用

函数可以嵌套调用,但是不能嵌套定义。

cpp 复制代码
#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;
}

链式访问

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

cpp 复制代码
#include <stdio.h>
#include <string.h>
int main()
{
    char arr[20] = "hello";
 int ret = strlen(strcat(arr,"bit"));
 printf("%d\n", ret);
 return 0;
}
#include <stdio.h>
int main()
{
    printf("%d", printf("%d", printf("%d", 43)));
  
    return 0;
}

七、函数的声明和定义

函数声明

  • 告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在,函数 声明决定不了。
  • 函数的声明一般出现在函数的使用之前。要满足先声明后使用
  • 函数的声明一般要放在头文件中的

函数定义

函数的定义是指函数的具体实现,交待函数的功能实现。
test.h 的内容
放置函数的声明

#ifndef TEST_H
#define TEST_H
// 函数的声明
int Add ( int x , int y );
#endif //TEST_H
test.c 的内容
放置函数的实现
#include "test.h"
// 函数 Add 的实现
int Add ( int x , int y )
{
return x + y ;
}

八、函数递归

什么是递归

程序调用自身的编程技巧称为递归( recursion)。
递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接
调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。

递归的两个必要条件

  • 存在限制条件,当满足这个限制条件的时候,递归便不再继续。
  • 每次递归调用之后越来越接近这个限制条件

🎁结语:

本次精彩内容已圆满结束!希望各位读者在阅读过程中能够收获满满。在此,特别感谢各位读者的支持与三连赞。如果文章中存在任何问题或不足之处,欢迎在评论区留言,大星必定会认真对待并加以改进,以便为大家呈现更优质的文章。你们的支持与鼓励,将是博主不断前进的最大动力。再次感谢大家的陪伴与支持!

相关推荐
小此方16 分钟前
C语言自定义变量类型结构体理论:从初见到精通(上)
c语言·开发语言
努力也学不会java22 分钟前
【Java并发】揭秘Lock体系 -- 深入理解ReentrantReadWriteLock
java·开发语言·python·机器学习
lingggggaaaa22 分钟前
小迪安全学习笔记(一百零二讲)—— 漏扫项目篇&PoC开发&Yaml语法&插件一键生成&匹配结果&交互提取
笔记·学习·安全·网络安全·交互
里昆29 分钟前
【COMSOL】结构力学仿真(压缩弹性体)案例心得
学习
vxtkjzxt88835 分钟前
自动化脚本矩阵运营
开发语言·php
王严培.44 分钟前
7.MATLAB疑难问题诊疗的技术
开发语言·matlab·信息可视化
wjs20241 小时前
PHP MySQL 使用 ORDER BY 排序查询
开发语言
爱敲代码的TOM1 小时前
深入剖析Java通信架构下的三种IO模式2
java·开发语言·架构
UWA2 小时前
Unreal开发痛点破解!GOT Online新功能:Lua全监控 + LLM内存可视化!
开发语言·lua·unreal
肥肠可耐的西西公主2 小时前
后端(JavaWeb)学习笔记(CLASS 2):SpringBootWeb入门
笔记·学习