当前位置:网站首页>【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的值了。
运行结果:
۞结言
好了,这一节的内容就到这里,学习编程一定要去多实践,多调试,才能明白真理。希望对你有收获,我们下一节见哦!
边栏推荐
- 微信小程序getPhoneNumber接口code=40013
- Detailed explanation of network flow (what information can the flow network diagram generally reflect)
- LeetCode_139_word split
- RESTful style (detailed introduction + case implementation)
- RISC-V instruction format and 6 basic integer instructions
- 方正璞华“劳动人事法律自助咨询服务平台”在武汉武昌区投入使用!
- 新特性解读 | MySQL 8.0 GIPK 不可见主键
- 鲁大师7月新机性能/流畅榜:性能跑分突破123万!
- js炫酷仪表盘插件
- svg balloon rises explosion js special effect
猜你喜欢
动态组件-component
Article 48 - Analysis of timestamp2 parameters【2022-08-01】
一款强大的js弹出alert插件
水平垂直居中方式
图论之Kruskal,最小生成树如何优雅解题?
FreeRTOS creation tasks - dynamic creation, static creation
svg实现的树木四季变化
PHP+MYSQL [Student Information Management System] (Minimalist Edition)
js cool dashboard plugin
图论之Prim,最小生成树该怎么解?
随机推荐
LeetCode_377_Combination Sum IV
鲁大师7月新机性能/流畅榜:性能跑分突破123万!
There are several ways to jump to js source code, jump on the current page, jump on the blank page
Js scratchable latex style draw plug-in
Intouch Historian历史曲线配置导入导出
TFRecord简介,原理分析,代码实现?[通俗易懂]
js半圆环加载进度动画js特效
Introduction to Scala Basic Syntax (3) Various Operators in Scala
机器人碰撞检测方法形式化
Ribbon负载均衡的深度分析和使用
qt 编译报错 No rule to make target
PGSQL database to realize the import and export
企业用直播平台能实现什么
Seata Distributed Transaction
Win11怎么修改关机界面颜色?Win11修改关机界面颜色的方法
Oracle数据库的闪回技术
Do you know Dijkstra of graph theory?
LeetCode_139_word split
First acquaintance of scrapy framework 1
How to use the database like tap water?|Tencent Cloud Database TDSQL-C