当前位置:网站首页>【C语言】函数哪些事儿,你真的get到了吗?(1)
【C语言】函数哪些事儿,你真的get到了吗?(1)
2022-08-02 13:04:00 【凡人编程传】
作者:凡人编程传
系列:C语言初阶(适合小白入门)
说明:以凡人之笔墨,书写未来之大梦
۞前言
今天我们进入全新的一个章节——函数,在这个章节我们这一节将要介绍两个知识点,库函数和自定义函数。其中略讲库函数,细讲自定义函数,好了,废话不多说,直接进入正题吧!
۞函数三要素
我们就可以从我们用的最多的主函数main()来举例。
#include<stdio.h>
int main()
{
.....
}
可以知道main()函数的基本特征main这个单词,也就是函数名,接着就是不管函数有没有参数,都会有个括号,main函数左边还有一个int,表示整形。
综上可以知道函数的三要素是:
- 返回值类型
- 函数名
- 函数参数(其中注意参数也有类型)
可以知道基本格式:
返回值类型 函数名(参数类型 参数1,参数类型 参数2 …)
۞C语言的库函数
C语言的标准库中,提供了很多的库函数来用于解决我们在编写程序中经常要处理的事情,从而大大提升了编写代码的效率,如输入函数scanf和输出函数printf这两个函数就是解决了我们要经常输入和输出而要写代码来自己实现的这种不必要的代码。
这里我们介绍两个库函数来了解一下库函数的基本使用
strcpy函数(举例)
学习使用库函数我们要会使用工具,这里给大家推荐两个工具。一个是MSDN这个工具大家可以自己在网上搜索下载,另外一个是lcplus.这个网站也可以学习库函数
那么下面我们就用MSDN来查一查这个函数
可以了解到这个函数的头文件是< strring.h >,函数的返回值类型是char*(关于后面的指针章节会详细介绍),参数1是要copy到的目的地址,参数2是进行拷贝的数据源地址。这个函数的功能是复制字符串,然后拷贝到另一个存放字符串的数组中。
有了以上信息我们不妨试一试这个函数,把一个字符数组的内容,拷贝到另一个字符数组里面去。
#include<stdio.h>
#include<string.h>
int main()
{
char arr1[20]; //要进行存放拷贝字符串的数组
char arr2[] = "hello bit!"; //进行拷贝的字符数组
strcpy(arr1, arr2);
printf("%s\n", arr1);
return 0;
}
运行结果:
当然,这个函数还有其他要注意的使用地方,在这里我们只是了解一下,后面我会更新自己如何实现这个函数的文章,到时候我们再来深入了解这个函数的细节.下面进入我们这一节的重要环节。
۞自定义函数
如果库函数能实现全部的功能的话,那还要程序员干什么呢?很明显,库函数不能实现所有的功能,所以C语言就提供了让程序员自己写函数的空间,让程序员更能发挥自己的实力。
前面介绍的函数三要素,我们库函数要遵守,自定义函数也是要遵守的,所以我们要自己写一个函数时,一定不要忘了这三个要点。
求两个数的最大值(自定义函数实现)
有的同学就可能说,简单嘛,if…else语句轻轻松松搞定。但是要是你后面的程序中,经常要用求两个数的最大值这个功能呢?每次都写一次f…else语句?这未免太麻烦了吧!这时候我们就可以把实现这个功能的代码封装成一个函数,只需要每次调用这个函数就可以了,是不是要省事的多?
那么具体咋写呢?首先我们假设这个自定义函数是get_max()然后光写这个肯定不行啊,你要比较两个数谁大啊!是不是要把这两个数传给自定义函数,不然函数比较什么的大小呢?
比如要比较3和5谁大就应该吧3和5给get_max函数吧,也就是get_max(3,5);那传完参数,就完了吗?显然不是,传给了get_max函数具体get_max函数怎么才能比较大小呢?还不是要我们自己敲代码来实现.这个实现的过程也叫做函数定义.
上面说了,一个函数一定有三要素,那么get_max这个自定义函数也肯定有他的返回值类型,函数名,参数类型和参数。这里get_max就是函数名,那我们还差返回值类型和参数类型和参数,试想,这个函数的功能是比较两个整数的大小,那么返回的肯定是那个大的数,那个大的数也是整数吧,所以get_ma的返回值类型就是int;然后,他的参数类型 和参数,我们传过来的是两个整形类型的整数,参数类型是不是也该写int啊,参数就可以写成一个变量来接受这个整数。
有了以上了解,就可以敲代码了。
#include<stdio.h>
int get_max(int x, int y)
{
int z = 0; //用来存放最大值
if (x > y)
z = x;
else
z = y;
return z; //返回最大值,这里返回的类型要与函数的返回值类型对应
}
int main()
{
int a = 10, b = 20;
int max = get_max(a, b); //用一个max变量来接受自定义函数的返回值
printf("max=%d", max);
return 0;
}
运行结果:
交换两个变量的值
通过上一题的训练,相信大多数人多了解了自定义函数是咋回事,该怎么实现。也就可以咔咔写出这道题的代码。但是我还是说一下这道题的思路:
我们假设有一瓶醋和一瓶酱油,现在要把醋放在酱油瓶子里,吧酱油放在醋瓶子里,我们是不是可以另外拿一个空瓶子来当"中间商",先把醋倒进空瓶子里面,然后醋瓶子是不是空了,这时候就可以把酱油倒进醋瓶子里面,然后这时候酱油瓶子又空了,这时候就可以吧装在空瓶子里面的醋倒进酱油瓶子里面了,这时候我们就实现了酱油和醋的交换。
那么交换两个变量的值是不是也同样的一个道理呢?有了这个思路我们就可以咔咔敲代码了.
#include<stdio.h>
void Swap(int x, int y) //由于这个函数这实现交换两个变量的功能,并不需要返回什么,就可以写成void类型
{
int t = x;
x = y;
y = t;
}
int main()
{
int a = 10, b = 20;
printf("交换前的值 a=%d,b=%d\n", a, b);
Swap(a, b);
printf("交换后的值 a=%d,b=%d\n", a, b);
return 0;
}
运行结果:
结果咔咔写出了,交换前和交换后是一样的,这时候有的同学就摸不着头脑了,就一口咬定我这算法没错啊,肯定是计算机的问题!记住,计算机是不会骗你的。那么是咋回事了,这就要引出另外1个知识点了,让我带着你捋一捋。
咱们不妨调试一下来看一下函数的实现过程:
注意看a和b的地址
这时候我们把a和b传给了Swap函数的参数x和参数y.
由图可知,虽然参数x和y的确接受了a和b的值,但是和a和b的地址(内存空间)不同,所以就算交换了x和y的值,也仅仅是交换了参数x和y的值,并没有实际交换到a和b的值,因为a和b与x和y的内存空间不同,交换这个动作只对x和y那两块内存空间的进行了操作,故而没有影响到a和b。那么这里就可以知道我们那里出问题了,现在我们要解决的问题就是如何让x和y找到a和b的地址进行操作?这里就要扩展后面的知识点——指针
我们把 数据类型标识符* 指针变量名这一个格式叫做指针变量,如int*a;就是一个指针变量,而指针变量的作用恰好就是可以存放一个变量的地址,而且,*a(解引用)就可以通过存放在指针变量a的地址去找到那个地址里面的内容,那么我们是不是就可以把Swap函数的两个参数设计成int *类型的指针变量呢,这样就可以存放a和b的地址了。那么现在又有一个问题,就是如何得到a和b的地址,这就可以用到&操作符,来进行取地址操作即可.
有了以上知识点,就可以放心敲代码了!
#include<stdio.h>
void Swap(int* x, int*y) //用两个指针变量来存放a和b的地址
{
int t = *x; //解引用地址找到a这个地址里面的内容(也就是a这个变量存放的值)
*x = *y;
*y = t;
}
int main()
{
int a = 10, b = 20;
printf("交换前的值 a=%d,b=%d\n", a, b);
Swap(&a, &b); //把a和b的地址传给函数
printf("交换后的值 a=%d,b=%d\n", a, b);
return 0;
}
这时候我们再来看a和b与x和y的地址
是不是就相同了,这时候就可以改变a和b的值了。
运行结果:
۞结言
好了,这一节的内容就到这里,学习编程一定要去多实践,多调试,才能明白真理。希望对你有收获,我们下一节见哦!
边栏推荐
- In-depth analysis and use of Ribbon load balancing
- Wireless vibrating wire acquisition instrument remote modification method
- MFC入门教程(深入浅出MFC)
- js semi-circle loading progress animation js special effects
- 第48篇-timestamp2参数分析【2022-08-01】
- RESTful style (detailed introduction + case implementation)
- 自动生成代码器推荐-code-gen
- photo-sphere-viewer Chinese documentation
- 3 ways for OpenFeign to set headers
- Seata分布式事务
猜你喜欢
随机推荐
JS中的闭包
Basic operations of openGauss database (super detailed)
SQL Server database generation and execution of SQL scripts
Detailed explanation of network flow (what information can the flow network diagram generally reflect)
Wireless vibrating wire acquisition instrument remote modification method
js数组递归使用
php - the first of three solid foundations
LeetCode_139_单词拆分
Automatically generate code generator recommendation-code-gen
OpenFeign设置header的3种方式
基于华为eNSP的企业网络规划
鲁大师7月新机性能/流畅榜:性能跑分突破123万!
如何通过DBeaver 连接 TDengine?
js true 3d histogram plugin
30 lines of code to realize serverless real-time health code recognition -- operation manual
我的创作纪念日
ETL(二):表达式组件的使用
麻烦问一下,对mysql 场景注入故障,是不是不是对mysql server 端注入故障,只是对ja
js semi-circle loading progress animation js special effects
package.json and package-lock.json