函数和数组——函数

1函数的概述:

大家都知道在数学中我们学习过函数,C语言中函数包含着程序的可执行代码,是定义模块的我会在函数定义时介绍

这里要注意:在程序中main函数有且只有一个

2函数的分类:

2.1库函数:

在以前是没有库函数的但是以前有好多相同功能的自定义函数但因为所有程序员都使用频繁所以就C语言,所以后面ANSI C规定了⼀些常⽤的函数的标准,被称为标准库,那不同的编译器⼚商根据ANSI C提供的C语⾔标准就给出了⼀系列函数的实现。这些函数就被称为库函数。

我们在刚学学习C语言中用到的main()函数和打印字发printf()都是库函数

还有在使用库函数时要包含头文件#include<>

我们可以在cppreference.com和cplusplus中学习库函数


3自定义函数

如果我们写程序时全用库函数还要程序员干嘛所以我们要自定义函数来实现功能

如上图是函数在定义时注意的格式,在定义函数时要有返回类型函数名(这个可以随便取名,但是为了可读性大家最好写的有意义方便他人阅读毕竟写代码不是只给自己看)最后是参数在后面我会在实参和形参中说明,接下来看下面例题

这边我定义了一的函数返回值打印,在函数调用中值得注意的就是

写函数时要定义返回类型 (好像就这个比较要注意的)

4实参和形参

实际参数就是传值过去的参数如图

4.1实参

实参在调用函数后的括号里a和b就是实参

这里注意实参是确定的数不能是变量必须是确定的值方便把实参传递给形参

4.2形参

形参就是函数定义后面的如图

如上函数后的括号中的的参数x和y就是形参,因为形参只有在被调用的时候才被实例化所以叫形式参数

重要:当实参传给形参的时候形参其实是实参的临时拷贝对形参的修改不会改变实参

5传值调用—传址调用

5.1传值调用

因为函数的形参和实参有不同的代码块存放的位置不同所以

传值调用无法改变实参中的内容

接下来我们来看一道例题:

我本来是要交换a和b的值但是调用函数之后为什么没有交换呢,这就是传值调用的缺点(函数的形参和实参占用的代码块不同,对形参的修改不会影响实参)所以a和b没有交换

5.2传址调用

在说传址调用之前我来科普一下(我估计大家也都知道)就是在每个形参和实参在传递时都会生成独立的空间

接下来我来举个例子

如上图因为实参和形参在创建的时候会生成独立的空间所以我们要传地址,把地址传进形参这样就可以在形参中改变实参的内容(用官方一点的方式讲一下,传址调用是把函数外部的创建变量的内存地址传入递给函数参数的一种调用方式)把实参的地址传入形参中用(解应用符号  " * ")  的方式调用实参中地址的数 ,然后定义mun变量交换实参中的数以求a,b中的数进行交换如图

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

6.1嵌套调用

函数中的嵌套调用就是函数可以在函数中调用其他函数如图

如上图函数可以相互调用,但是不可以在函数中(嵌套调用)定义函数否则会报错如图

在main函数中定义了Add函数所以报错了

6.2链式访问

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

如图因为我们函数中的(空间存放在栈区中然后栈区存入方式是先入后出)大家了解一下就行后面指针后学习,因为我们是先进后出所以我们在打印的时候就是最后进入栈区中的数字先打印就出现了如图(4321)

7函数的声明和定义

7.1函数的声明

1声明就是告诉计算机有这个函数叫什么,数据类型是什么,参数是什么但具体是不是存在无关紧要

2函数的声明一般出现在函数使用之前。要满足声明后使用

如图在函数定义后面加一个分号就是函数的声明(这里有东西挡住了往后看👍)

7.2函数的定义

函数的定义是指函数的具体实现,交代函数功能的实现

 

如图定义在main()函数之前的就是函数的定义 其实可以用函数的声明放在前面把定义放在后面,可是后面写程序都是一个模块写的如下图写出一个简单的计算机

如图就是一个简单的计算器实现看,可以看到我的头文件和头文件分了好几种不同的这就是函数的声明我把函数的实现全放在setof.c源文件中了,(由于我多文件没有学会就把函数的实现全放在另一个源文件中了)其实我们图也能理解在我们实际我们写代码是把函数的声明放在头文件中的,函数的实现是放在源文件中的这是方便我们在日后的工作中习惯(因为以后在工作中写代码也是这样写的大家一定要熟练),最后总结(在程序中函数声明是写在头文件中的,函数的定义是写在源文件中的

8函数递归

函数在其定义或说明有直接或间接调用函数自身的方法叫做递归

函数递归存放在栈区中如栈区满了就会报错

如图我们把main函数相互定义但是为什么会报错呢,这就是函数直接调用函数本身但是函数递归其实和循环一样要(有判断条件否则就会栈溢出报错)且(每次递归都要跟接近这个条件)但是条件之间不能差距太大要不然栈溢出了一样会报错接下来我们来看看函数递归的几道题目了解一下

8.1递归输入输出1234

如图这是一道简单的函数递归的题目条件是

接受一个整型值(无符号),按照顺序打印它的,如图输入:1234 ,打印1234

 这里的的思路是因为我们要求四位数所以我们先求设y为1234
Add(1234/10) =4(这里是求出了最后面的4)
123%10=3(因为上面取出了4只剩下123再用取余数,取出3)
 12%10=2(因为上面取出3只剩下了12再取2)
当n最后为1时,不满足我们给定的限制条件n>9时,即打印1%10(=1

这里的取出来的数字之所以是1234是因为递归是存放在栈区中的,然后栈区的规则就是先入后出的规则

 

       8.2 求函数次幂

解题思路以x>0和y=0为限制条件,每一次递推就乘以x,并且y都减一次1,直到不满足限定条件,然后回归,即为

x=4,y=4 
con(x,4) 
x * con(y,4-1)
x * con(y,3-1)
x * con(y,2-1)

x*con(y,1-1)
以y>0和y=0为限制条件,当y=0时,直接返回1,然后回归

因为篇幅太多形象大家阅读观感后面递归还有几道经典题目大家有兴趣可以去了解一下

如:斐波那契数,青蛙跳台阶,汉诺塔等问题 

结尾:感谢大家看到这里,以上这就是我个人对函数的笔记和理解,如果有错误感谢各位大佬的指正谢谢大家!
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值