完整教程:C语言——函数(超详细分析)

news/2025/9/25 22:16:50/文章来源:https://www.cnblogs.com/slgkaifa/p/19112177

完整教程:C语言——函数(超详细分析)


润下:个人主页

  个人专栏: 《C语言基础》

⛰️万仞高山,只登一步!

文章目录

  • 一.函数的概念
  • 二.库函数
    • 2.1标准库和头文件
    • 2.2 库函数的使用方法
      • 2.2.1功能
      • 2.2.2 头文件包含
      • 2.2.3 实践
      • 2.2.4 库函数文档的一般格式
  • 三.自定义函数
    • 3.1 函数的语法形式
    • 3.2函数的举例
  • 四.形参和实参
    • 4.1 实参
    • 4.2 形参
    • 4.3形参和实参的关系
  • 五.return 语句
  • 六.数组做函数参数
  • 总结

函数是C语言基础重要的组成部分,在整个C语言学习过程中 经常会使用到函数,因此学会函数是学精C语言的关键一步!接下来,我将以我个人的视角,带领大家理解和感受函数是如何创建和使用!

一.函数的概念

函数对于我们来说并不陌生,自中学起我们就学习函数。在C语言中函数可以叫子程序,具体解释:函数是一个完成某项特定的任务的一小段代码。这段代码有特殊的写法和调用方法!
其实C语言程序是由无数个小的函数组合而成,每个函数都能完成某项特定的任务,也可以重复的使用!
C语言中常见的函数分为两类
库函数自定义函数

二.库函数

2.1标准库和头文件

C语言规定了C语言的各种语法,但是C语言不提供库函数。
但是人们在使用的过程中会经常用到例如:

求字符串长度
输入信息
输出信息
开平方

经常会使用这些功能,但是每个人都写一份,很浪费时间且不利于代码的可移植性,于是C语言国际标准ANSI规定了一系列常用函数的使用标准,就被称为标准库
不同的编译器厂商根据ANSI提供的C语言标准给出了一系列函数的实现,这些函数就被称为库函数。库函数也是函数只不过是现成的直接可以拿来使用,有了库函数代码在执行效率和函数质量都有了保证

库函数相关头文件

2.2 库函数的使用方法

库函数查询工具
✈️C/C++官方连接
cplusplus.com
举例

strlen
size_t strlen ( const char * str );
strlen 是函数名
str 是函数的参数,表示调用函数strlen需要传递一个 char* 类型的值
size_t 表示函数返回值的类型

在search中直接输入想要查询的函数

2.2.1功能

计算字符串的长度
返回字符串的长度大小
在这里插入图片描述

2.2.2 头文件包含

库函数是在标准库对应的头文件声明的,使用函数是必须包含头对应的文件,不然会出问题
在这里插入图片描述
该函数对应的头文件

2.2.3 实践

#include<stdio.h>#include<string.h>int main(){char s[] = "abcdef";size_t str = strlen(s);printf("%d\n", str);return 0;}

2.2.4 库函数文档的一般格式

1.函数原型
2.函数功能介绍
3.参数和返回类型说明
4.代码举例
5.代码输出
6.相关知识链接

三.自定义函数

库函数固然能让程序使用更加便利,但是自定义函数更为重要更具有创造性

3.1 函数的语法形式

ret_type fun_name(形式参数)
{
//内容
}
ret_type是函数的 返回类型
fun_name 是 函数名
{}是 函数体

我们可以把函数当成小型的加工厂,输入原料产生商品
函数也一样,我们输入参数进过函数的“加工” 得出结果
ret_type 表示返回的参数类型,可以是void表示什么都不返回
fun_name 表示 函数名可以随意起,尽量做到见名知意
函数的参数
1.可以是void,表示函数没有参数
2.有参数要交代清楚参数个数,类型,名字
{}是 函数体表示计算过程

3.2函数的举例

例子:写一个加法函数,完成加法操作

int Add(int x, int y)
{
return x + y;
}
int main()
{
int n = 0;
int m = 0;
scanf("%d%d", &n, &m);
int r = Add(n, m);
printf("%d\n", r);
return 0;
}

注:函数的参数部分一定要交代清楚函数的参数个数和类型,参数名是什么,可以灵活多变但是参数尽量不要超过四个

四.形参和实参

函数的参数可以分为实参和形参
用刚才上面写的代码举例

int Add(int x, int y)
{
return x + y;
}
int main()
{
int n = 0;
int m = 0;
scanf("%d%d", &n, &m);
int r = Add(n, m);
printf("%d\n", r);
return 0;
}

4.1 实参

在函数调用Add时传递给函数的n,m 称为实际参数简称实参
实际参数就是真实传递给函数的参数

4.2 形参

函数名Add中括号中的x,y 就是形式参数,简称形参
实际上Add虽然在形式上创造了x,y但是没有向内存申请空间,不是真实存在的,只有在函数被调用的过程中为了存放实际参数穿过来的值才会向内存申请空间,这个过程就是形参的实例化

4.3形参和实参的关系

虽然实参是传递给实参的,但是其中“暗藏玄机”,实参和形参的各自有独立的空间。
接下来用一段代码调试和演示

int Add(int x, int y)
{
int r = 0;
r = x + y;
return r;
}
int main()
{
int n = 0;
int m = 0;
scanf("%d%d", &n, &m);
int r = Add(n, m);
printf("%d\n", r);
return 0;
}

通过监视可以看到
在这里插入图片描述
x,y确实得到了n,m的值,但是它们的地址是不一样的
总结
1.形参和实参有自己各自的空间
2.形参的改变不会影响实参
3.形参是实参的一份临时拷贝
4.形参和实参名字可以相同,但是空间依旧不同

五.return 语句

在函数的设计中经常会使用return语句,return语句注意事项

5.1 return语句后面可以是一个数也可以是表达式,如果是表达式先执行表达式,再返回表达式的结果

int Sub2(int x, int y)
{
return x-y;
}
int Sub1(int x, int y)
{
int z = 0;
z = x - y;
return z;
}
int main()
{
int m = 0;
int n = 0;
scanf("%d%d", &m, &n);
int s = Sub1(m, n);
printf("%d\n", s);
printf("%d\n", Sub2(m, n));
return 0;
}

5.2 return也可以不写,表示什么都不返回一般用于返回值是void的情况

void test(int n)
{
if (n >
0)
{
printf("hehe\n");
}
else
{
printf("haha\n");
}
}
int main()
{
int n = 0;
scanf("%d", &n);
test(n);
return 0;
}

5.3 return语句执行后函数就彻底返回,后面的代码不再执行

int test(int n)
{
if (n >
0)
{
return 1;
printf("hahaha\n");
}
else
{
printf("hehe\n");
return 2;
}
}
int main()
{
int n = 0;
scanf("%d", &n);
test(n);
return 0;
}

在这里插入图片描述
5.4 return 返回值和函数返回类型不一样,系统会自动将返回值转换为函数的返回类型

int test()
{
return 3.14;
}
int main()
{
int r = test();
printf("%d\n", r);
return 0;
}

在这里插入图片描述
5.5 如果函数存在if分支语句,要保证每种情况下都有返回值否则会出现编译错误

int test()
{
int n = 0;
scanf("%d", &n);
if (n >
0)
return 1;
}
int main()
{
printf("%d\n", test());
return 0;
}

没有说明n<=0的情况,出现逻辑错误

在这里插入图片描述
5.6函数返回值类型不写,编译器会默认返回类型为int

test()
{
return 3.14;
}
int main()
{
printf("%d\n", test());
return 0;
}

在这里插入图片描述

5.7 函数写了返回类型,但是函数没有return语句返回值不确定

int test()
{
int r = 0;
}
int main()
{
printf("%d\n", test());
return 0;
}

在这里插入图片描述

六.数组做函数参数

函数在解决问题的时候难免会把数组做为参数传的给函数,在函数内部对数组进行操作

把数字全部都置为-1,再写一个函数打印数组

void Set_arr(int arr[], int sz)
{
int i = 0;
for ( i = 0; i < sz; i++)
{
arr[i] = -1;
}
}
void Print_arr(int arr[], int sz)
{
int i = 0;
for (i = 0; i < sz; i++)
{
printf("%d ", arr[i]);
}
}
int main()
{
int arr[] = {
1,2,3,4,5,6,7,8,9,10
};
int sz = sizeof(arr) / sizeof(arr[0]);
Set_arr(arr,sz);
Print_arr(arr,sz);
return 0;
}

传参的要点
1.函数的形式参数要和函数的实参个数匹配
2.函数的实际参数是数组,形参也要写成数组的形式
3.形参如果是一维数组,数组大小可以省略不写
4.形参如果是二维数组,行数可以省略,列数不可省略
5.数组传参,形参是不会创建新的数组
6.形参操作的数组和实参操作的数组是同一个数组

二维数组传参
例:

void Print_arr(int arr[][5], int r, int c)
{
int i = 0;
for (i = 0; i < r; i++)
{
int j = 0;
for ( j = 0; j < c; j++)
{
printf("%d ", arr[i][j]);
}
printf("\n");
}
}
int main()
{
int arr[3][5] = {
{
1,2,3
},{
4,5,6, 7,
} ,{
8, 9, 10
}
};
Print_arr(arr,3,5);
return 0;
}

总结

在这里插入图片描述

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

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

相关文章

大 LCP 时代(stupid.*)

大 LCP 时代(stupid.*) 题目描述 LCP 就是传说中的最长公共前缀,至于为什么要加上一个大字,那是因为…你会知道的(有大病)。 首先,求LCP就要有字符串。既然那么需要它们,那就给出n个字符串好了。 于是你需要回答…

网站中的滑动栏怎么做的四川建设网网

虚拟技术十分热门.虚拟技术是将一台物理硬件计算机虚拟成多台软件计算机.每一台虚拟出来的软件计算机(以下叫做虚拟机)用起来都就象是在用那台被虚拟的硬件计算机(以下叫做真实机)完全一样.当然这样的说法忽略了虚拟机相对于真实机在执行效益上不可避免所存在的损失.所以如何减…

实用指南:Python实现手榴弹爆炸算法(Grenade Explosion Method, GEM)(附完整代码)

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

Day08-C:\Users\Lenovo\Desktop\note\code\JavaSE\Basic\src\com\David\array-ArrayDemo01~07

数组首先要声明数组变量才能使用如dataType[] arrayRefVar; java语言中使用new操作来创建数组,如dataType[ ] arrayRefVar = new dataType[arraysize] 数组通过索引访问,索引从0开始内存分析堆:存放new的对象和数组…

yolov10_float16.tflite TO yolov10_int8.tflite

使用google colab平台1. 安装ultralytics!pip install ultralytics2. 导入yolo并从ultralytics加载yolov10n.ptfrom ultralytics import YOLO model = YOLO("https://github.com/ultralytics/assets/releases/dow…

ansible注意的和错误代码分析

一、需要注意的点分清楚这个是主控节点还是被控节点的操作,有的时候是一个文件从主控到被控节点,还是被控节点的文件到主控节点上面了剧本执行报错代码 # 仔细看,报错的原因就是ansibel_lvm 未定义,写错了变量名TA…

用 Rust 和 Tesseract OCR 识别验证码

一、背景介绍 Rust 是一种系统级编程语言,以性能和安全性著称。在自动化测试和数据分析场景中,验证码识别是一个常见挑战。结合 Tesseract OCR,我们可以使用 Rust 构建一个高效的验证码识别工具。本文将介绍如何使用…

基于寄存器地址amp;标准外设库的LED流水灯

实验任务2 1.1先在工程总文件夹中创建User,Library和Startup三个文件夹,然后右键keil中的文件夹Source Group 1添加工程所需的这三个文件夹。1.2分别在Library,Startup和User三个文件夹中添加必要的头文件和.c文件。…

用 Swift 和 Tesseract OCR 实现验证码识别

一、背景介绍 Swift 是 Apple 推出的现代化编程语言,广泛应用于 iOS 和 macOS 应用开发。结合 Tesseract OCR,可以在移动和桌面应用中高效地识别验证码。本文将展示如何使用 Swift 结合 Tesseract OCR 实现验证码自动…

Rust 和 Tesseract OCR 实现验证码识别

一、背景介绍 Rust 以其高性能和内存安全著称,适合构建高效的图像处理和 OCR 应用程序。本文将结合 Tesseract OCR,使用 Rust 实现验证码识别。 二、环境准备 2.1 安装 Rust 更多内容访问ttocr.com或联系1436423940 …

AI-Powered-ToDo-List

AI-Powered-ToDo-List https://github.com/fanqingsong/AI-Powered-ToDo-ListAI 智能任务管理器基于 LangGraph 和 React 的智能任务管理应用,支持传统手动管理和 AI 对话式管理两种方式。✨ 功能特性🎯 双重管理方…

Netty:完成RPC服务(实战)

Netty:完成RPC服务(实战)pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco",…

Python 在 Web 开发中的应用与趋势

一、引言 🌐 随着互联网的普及和应用场景的不断拓展,Web 开发已经成为软件工程的核心组成部分。从简单的静态网页到复杂的交互式应用,Web 技术在近二十年间经历了飞速发展。而 Python,作为一门简洁优雅、功能强大…

网页设计怎么建站点店铺管理软件

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;MQ ⛺️稳中求进&#xff0c;晒太阳 定义 消息队列&#xff1a;一般我们简称为MQ(Message Queue) Message Queue :消息队列中间件&#xff0c;很多初学者认为&#xff0c;MQ通过消息的发送…

校园交友|基于SprinBoot+vue的校园交友网站(源码+数据库+文档) - 实践

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

LLM MOE的进化之路

1. 阅读前提 本次课一共讲解三个不同版本的 MOE,分别是基础版MOE,大模型训练用的 SparseMoE,还有 DeepSeek 用的比较多的 shared_expert 的 SparseMoE。 2. 版本1:基础版本MOE 输入是一个 Token, 输出是一个 Token…

相交链表-leetcode

题目描述 给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null 。 图示两个链表在节点 c1 开始相交:题目数据 保证 整个链式结构中不存在环。 …

【pytorch】关于深度学习模型是怎么使数据从头流动到尾的

【pytorch】关于深度学习模型是怎么使数据从头流动到尾的Posted on 2025-09-25 21:52 SaTsuki26681534 阅读(0) 评论(0) 收藏 举报问题描述 之前在看cycleGAN的代码时想到一个问题 代码里用类的方式定义cycleGAN模…

AtCoder ARC114 总结 (A-C)

AtCoder ARC114 总结 A 50 内只有 15 个质数。\(2^{15}\) 枚举所有情况然后 \(O(n)\) check 即可。 B 若 \(i\to f(i)\) 连边,原题意相当于选出若干个环。答案即 \(2^{\text {环数}}-1\)。 C 考虑一开始每个数都有 \(…

松江郑州阳网站建设郑州专业网站设计

运维 | 使用 Docker 安装 Jenkins | Jenkins 前言 本期内容主要是为了学习如何通过 Docker 安装Jenkins&#xff0c;仅作为记录与参考&#xff0c;希望对大家有所帮助。 准备工作 系统&#xff1a;CentOS 7.9配置&#xff1a;4c8g 快速安装 下面以 Docker 方式安装 Jenkin…