掌握函数(一):库函数与自定义函数、形参与实参、return语句

目录

一、概念

二、库函数与自定义函数

(一)库函数

1、定义

2、标准库和头文件

3、库函数的使用方法

4、举例——这里以sqrt为例

(1)功能Compute square root 计算平方根Returns he square root of x.(返回平方根)

(2)头文件

(3)实践

(4)库函数文档的一般格式

(二)自定义函数

1、语法形式

 2、举例

三、形参和实参

(一)形参

(二)实参

(三)两者的关系

四、return语句 

总结


个人主页:艾莉丝努力练剑

学习方向:C/C++方向学习者

个人专栏:《C语言》

座右铭:效法羲和驭天马,志在长空牧群星!

前言:前面几篇文章介绍了c语言的一些知识,包括循环、数组、函数等,在这篇文章中,我将介绍函数的一些重要知识点!

专栏传送门《C语言》


 


一、概念

         数学中我们其实就见过函数的概念,比如:一次函数 y = kx + b ,k和b都是常数,给一个任意的x,就得到一个y值。其实在C语言也引入函数(function)的概念,有些翻译为:子程序,子程序这种翻译更加准确一些。
         C语言中的函数就是一个完成某项特定的任务的一小段代码。这段代码是有特殊的写法和调用方法的。

#include <stdio.h>

// 函数定义
int add(int a, int b)
{
 int sum = a + b;
 return sum;
}

 int main()
{
 int result = add(3, 5); // 函数调用
   printf("3 + 5 = %d\n", result);
 return 0;
}

 如图中的的add就是一个C语言函数,add函数接受两个整数参数a和b,计算它们的和,并通过return返回结果。
         C语言的程序其实是由无数个小的函数组合而成的,也可以说:一个大的计算任务可以分解成若干个较小的函数(对应较小的任务)完成。同时一个函数如果能完成某项特定任务的话,这个函数也是可以反复使用的,提升了开发软件的效率。
         在C语言中我们一般会见到两类函数:库函数和自定义函数

二、库函数与自定义函数

(一)库函数

1、定义

C语言标准中规定了C语言的各种语法规则,C语言并不提供库函数;C语言的国际标准ANSIC规定了一些常用的函数的标准,被称为标准库,那不同的编译器厂商根据ANSI提供的C语言标准就给出了一系列函数的实现。这些函数就被称为库函数

之前介绍的printf、scanf就都是库函数,库函数也是函数,不过这些函数已经是现成的,我们只要学会就能直接使用了。

好处:有了库函数,一些常见的功能就不需要程序员自己实现了,一定程度提升了效率;同时库函数在质量和执行效率上都更有保证。
各种编译器的标准库中提供了一系列的库函数,这些库函数根据功能的划分,都在不同的头文件中进行了声明。

2、标准库和头文件

在这里,我给友友们推荐一个网址:库函数相关头文件

这些库函数有数学相关的,有字符串相关的,有日期相关的等,每⼀个头文件中都包含了,相关的函数和类型等信息,库函数的学习不用着急一口气吃成个胖子,慢慢学习,逐一击破就可以了。

3、库函数的使用方法

这里再给友友们推荐一些学习库函数的查看工具:
C/C++官方的链接——C标准库标头;
https://legacy.cplusplus.com/reference/clibrary/——这个是C++的网址,它存在两个版本,新版本没有检索功能,旧版本有,如果要切换回旧版本,点击右上角的“旧版本”浏览器可能有自带的整页翻译,如果没有,点击“Legacy version”,就能切换回旧版本了。

4、举例——这里以sqrt为例
double sqrt (double x);

//sqrt 是函数名 

//x 是函数的参数,表⽰调⽤sqrt函数需要传递⼀个double类型的值 

//double 是返回值类型 - 表⽰函数计算的结果是double类型的值
 (1)功能
Compute square root 计算平方根
Returns he square root of x.(返回平方根)
(2)头文件

库函数是在标准库中对应的头文件中声明的,所以库函数的使用,务必包含对应的头文件,不包含是可能会出现一些问题的。

(3)实践
#include <stdio.h>

#include <math.h>

int main()
{
 double d = 16.0;
 double r = sqrt(d);
 printf("%lf\n", r);
 return 0;
}

咱们运行一下:

 

算出来啦!

(4)库函数文档的一般格式

我们查看库函数文档时要注意其一般格式:

1.函数原型

2. 函数功能介绍

3. 参数和返回类型说明

4. 代码举例

5. 代码输出

6. 相关知识链接

(二)自定义函数

自定义函数非常重要,也能让程序员写代码时有更多的创造性。

1、语法形式

自定义函数和库函数是一样的,形式如下:

ret_type fun_name(形式参数)
{

}

(1)ret_type 是函数返回类型

(2)fun_name 是函数名

(3)括号中放的是形式参数

(4){ }括起来的是函数体

把函数想象成小型的一个加工厂,工厂得输入原材料,经过工厂加工才能生产出产品,那函数也是一样的,函数一般会输入一些值(可以是0个,也可以是多个),经过函数内的计算,得出结果。

ret_type 是用来表示函数计算结果的类型,有时候返回类型可以是 void ,表示什么都不返回;

fun_name 是为了方便使用函数;就像人的名字一样,有了名字方便称呼,函数有了名字方便调
用,所以函数名尽量要根据函数的功能起的有意义;

函数的参数就相当于,工厂中送进去的原材料,函数的参数也可以是 void ,明确表示函数没有参
数。如果有参数,要交代清楚参数的类型和名字,以及参数个数;

{ }括起来的部分被称为函数体,函数体就是完成计算的过程。

 2、举例

举个例子:
写一个加法函数,完成2个整型变量的加法操作。

#include <stdio.h>

int main()
{
 int a = 0;
 int b = 0;
 //输⼊ 
 scanf("%d %d", &a, &b);
 //调⽤加法函数,完成a和b的相加 
 //求和的结果放在r中 
 //to do

 
 //输出 
   printf("%d\n", r);
 return 0;
}

咱们根据要完成的功能,给函数取名:Add,函数Add需要接收2个整型类型的参数,函数计算的结果也是整型。我们根据上述的分析写出函数: 

#include <stdio.h>

int Add(int x, int y)
{
 int z = 0;
 z = x+y;
 return z;
}

int main()
{
 int a = 0;
 int b = 0;
 //输⼊ 
 scanf("%d %d", &a, &b);
 //调⽤加法函数,完成a和b的相加 
 //求和的结果放在r中 
 int r = Add(a, b);
 //输出 
   printf("%d\n", r);
 return 0;
}

我们可以把Add函数给简化一下:

int Add(int x, int y)
{
 return x+y;
}

函数的参数部分需要交代清楚:参数个数,每个参数的类型,形参的名字。

上面只是一个例子,未来我们是根据实际需要来设计函数,函数名、参数、返回类型都是可以灵活

变化的。

三、形参和实参

函数使用的过程中,把函数的参数分为:实参和形参。

回顾一下之前写的代码:

#include <stdio.h>

int Add(int x, int y)
{
 int z = 0;
 z = x+y;
 return z;
}

int main()
{
 int a = 0;
 int b = 0;
 //输⼊ 
 scanf("%d %d", &a, &b);
 //调⽤加法函数,完成a和b的相加 
 //求和的结果放在r中 
 int r = Add(a, b);
 //输出 
   printf("%d\n", r);
 return 0;
}

(一)形参

在上面代码中,第2行定义函数的时候,在函数名 Add 后的括号中写的 x 和 y ,称为形式参数,简
形参
为什么叫形式参数呢?实际上,如果只是定义了 Add 函数,而不去调用的话, Add 函数的参数 x和 y 只是形式上存在的,不会向内存申请空间,不会真实存在的,所以叫形式参数。形式参数只有在函数被调用的过程中为了存放实参传递过来的值,才向内存申请空间,这个过程就是形参的实例化。

(二)实参

在上面代码中,第2~7行是 Add 函数的定义,有了函数后,再第17行调用Add函数的。
我们把第17行调用Add函数时,传递给函数的参数a和b,称为实际参数,简称实参
实际参数就是真实传递给函数的参数。这可以和下文中两者的关系结合起来理解。

(三)两者的关系

先说结论:形参是实参的一份临时拷贝。

虽说实参是传递给形参的,而且他们的确是有联系的,但是形参和实参各自是独立的内存空间

这个现象是可以通过调试来观察的:

#include <stdio.h>

int Add(int x, int y)
{
 int z = 0;
 z = x + y;
 return z;
}

int main()
{
 int a = 0;
 int b = 0;
 //输⼊ 
 scanf("%d %d", &a, &b);
 //调⽤加法函数,完成a和b的相加 
 //求和的结果放在r中 
 int r = Add(a, b);
 //输出 
   printf("%d\n", r);
 return 0;
}

在调试的时候可以观察到,x和y确实得到了a和b的值,但是x和y的地址和a和b的地址是不一样的 :

这里再挖一个坑,笔者打算更新一篇关于函数栈帧的创建与销毁 。

四、return语句 

在函数的设计中,函数中经常会出现return语句,这里讲一下return语句使用的注意事项

1.return后边可以是一个数值,也可以是一个表达式,如果是表达式则先执行表达式,再返回表达式 的结果。

2.return后边也可以什么都没有,直接写 return; 这种写法适合函数返回类型是void的情况。

3.return语句执行后,函数就彻底返回,后边的代码不再执行。

4.return返回的值和函数返回类型不⼀致,系统会自动将返回的值隐式转换为函数的返回类型。 

5.如果函数中存在 if 等分支的语句,则要保证每种情况下都有return返回,否则会出现编译错误。

6.函数的返回类型如果不写,编译器会默认函数的返回类型是int。

7.函数写了返回类型,但是函数中没有使用return返回值,那么函数的返回值是未知的。

总结

往期回顾:

C语言常见概念、数据类型以及变量的一些重要知识点总结

变量的一些知识点整理(续)、算术操作符、赋值操作符:=和复合赋值、单目操作符以及强制类型转换的知识点总结

单目操作符++、--的前置后置知识点总结,printf函数的一些知识点 

掌握分支与循环(一):if语句、三种操作符、switch语句 

掌握分支循环(二):三种循环、break和continue语句、循环的嵌套以及 goto 语句 

掌握数组:一维数组、二维数组、变长数组及简单的二分查找 

【综合运用】关机程序、猜数字小游戏以及扫雷游戏基础版 

这就是本文的全部内容啦,笔者立下军令状:函数的后半部分会在明天准时更新!如果文章对你有帮助的话,欢迎评论,点赞,收藏加关注,感谢大家的支持!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值