0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

函数与递归-2

汽车电子技术 来源:微亮笔记 作者: PASSION 2023-02-21 15:53 次阅读

书接上回图片图片

上期主要是C语言中关于函数的部分知识,我向大家介绍了函数的定义,库函数,自定义函数的定义和使用方法及函数参数的类型。这些内容都是对函数的基本认识,而函数在编程过程中的具体使用和更深层次的知识我们将在本期及下期内容介绍。话不多说,我们开始本期的学习图片

本期将在上期基础之上继续加深对函数的认识

1.函数的两种调用方法和区别

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

3.函数的声明和定义

  • 函数的调用

** 传值调用**

函数的形参和实参分别占有不同的内存块,对形参的修改不会影响实参

** 传址调用

** 传址调用是把函数外部创建变量的内存地址传递给函数参数的一种调用函数的方式

此传参方式可以让函数和函数外面的变量建立起真正的联系。也就是说,函数内部可以直接操作函数外部的变量。

只听定义会一头雾水,接下来我为大家提供一个具体问题来方便大家感受两种调用的区别。

 应用:**【给出两个变量ab。 要求交换二者的值】**
#include 
void swap1(int x,int y)//此函数无返回值,因此用"void"作为返回值类型
{
  int tmp=0;
  tmp=x;
  x=y;
  y=tmp;
}//定义函数,交换变量值
int main()
{
  int a=10;
  int b=20;
  swap1(a,b);//无返回值函数的执行方法,我们接下来会提到
  printf("a= %d b= %d",a,b);
  return 0;
}

如上述函数,我们看似成功地完成了任务,但当我们在执行程序之后,屏幕上打印出来的却仍是"a=10 b=20",这说明我们刚才所写函数并不能完成我们所预期的功能,那问题出在哪里呢?请看接下来的代码:

#include
void swap2(int* x,int* y)//此处与上面函数不同,体会"int"与"int*"的区别
{
  int tmp=0;
  tmp=*x;
  *x=*y;
  *y=tmp;
}
int main()
{
  int a=10;
  int b=20;
  swap2(&a,&b);//此处也是不同之处
  printf("a= %d b=%d", a, b);
  return 0;
}
而这个代码运行的结果就达到了我们想要的效果,这就是两种调用的不同之处,传值调用是将实际参数拷贝到函数的形式参数中,在经过一系列运算后得出结果,它注重的是返回值;而传址调用则是直接将存放实际参数的地址传递给函数,一般用于需要对函数参数自身改变的程序,如上面提到的交换两个变量的值,这种调用一般来说都是没有返回值的。

当我们在定义完一个函数,要在主函数中去使用时,我们仍需要注意一个细节,那就是在使用有返回值的函数时需要有一个变量去接收,而没有返回值的函数就不需要考虑这个问题了。

在听完对两种调用的介绍后,相信大家对函数调用已经有初步的认识了,那么我们接下来看几道关于函数调用的问题:

1.写一个函数判断一个数是否是素数

2.写一个函数判断一年是否是闰年

3.写一个函数实现一个整型有序数组的二分查找

4.写一个函数,每调用一次,就会将变量"num"的值加一

由于篇幅有限,我这里就不给出以上问题的详解了,具体的习题集合我会之后专门出一个合集来介绍。以上问题需要用到的函数调用方法分别是1~3:传值调用,4:传址调用。

而我们在实际的使用过程中还是遵循**“需要对函数参数自身改变的就用传址调用;需要在运算后得出一个新结果的就用传值调用**”这一原则。

一句话,熟能生巧,用多了我们自然而然就会了图片图片

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

** 函数与函数之间是可以有机结合的

嵌套调用

在函数中可以调用另一个函数,这种方式叫嵌套调用。由于比较简单,这里就不举例子了图片图片

链式访问

把一个函数的返回值作为另一个函数的参数。这个概念同样比较好理解,不过这里有个很有趣的例子图片图片

#include
int main()
{
  printf("%d",printf("%d",printf("%d",43)));
  //结果是啥???
  return 0;
}

大家的第一反应应该都是认为屏幕上会打印出“43 43 43”,但是在程序运行后,屏幕上却打印出了“4321”。问题出在哪儿呢?原来c语言规定,printf的返回值就是它所打印的字符个数,在上述例子中,最内层的printf打印了“43”,所以它的返回值(就是2)成为了第二个printf的参数,以此类推,屏幕上就打印出了上述的结果。

  • 函数的声明和定义

函数声明

1.告诉编译器有一个函数叫什么,参数是什么,返回类型是什么。但是具体是不是存在无关紧要。

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

3.函数的声明一般要放在头文件中。

函数定义

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

下面举一个简单的函数声明的例子:

int add(int ,int );
int main()
{
  int a=10;
  int b=20;
  int sum =0;
  sum=add(a,b);
  printf("%d",sum);
  return 0;
}
int add(int x,int y)
{
  return (x+y);
}

如上述代码所写,我们先在程序最上面声明了存在“add”这一函数,所以程序在执行时就不会报错。我们要知道的是,C语言在执行时是从上到下依次执行的。如果不事先声明的话,在函数位于主函数后面的情况下去运行,程序就会报错。

当然我们声明函数并不是用来写上面的代码,这种写法非常睿智,我只是举个函数声明的例子。函数声明更多情况下适用于一些比较复杂的程序,当我们需要写一些复杂的代码时,由于多人分工,大家会分别负责不同的模块,这时我们就可以创建多个源文件和对应的头文件分别进行编程,在使用时就会方便很多了图片图片

好了,我们这期的内容就结束了,祝大家新年快乐!图片图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 内存
    +关注

    关注

    8

    文章

    2957

    浏览量

    73781
  • 函数
    +关注

    关注

    3

    文章

    4273

    浏览量

    62290
  • 变量
    +关注

    关注

    0

    文章

    613

    浏览量

    28300
收藏 人收藏

    评论

    相关推荐

    32-代码复用与函数递归-2

    编程语言代码行业芯事经验分享
    硬件天空
    发布于 :2022年05月30日 14:26:40

    数据结构与算法:1-4-1-函数递归(2)#结构数据

    数据结构与算法
    学习硬声知识
    发布于 :2022年12月18日 10:15:11

    《C Primer Plus》读书笔记——递归

    本帖最后由 cugwyman 于 2017-2-5 20:14 编辑 递归的原理一个函数调用其本身,此调用过程为递归(recursion)。
    发表于 02-05 20:06

    LabVIEW递归

    感受到了递归的复杂和重要性。在爱因斯坦这一问题中,程序设计的时候反复递归,一个递归函数再调用另外一个递归
    发表于 02-19 11:52

    Labview递归函数的使用案例

    Labview递归函数的使用案例,简单的1+2+3...+100求和,简单易懂,充分理解递归函数的思想
    发表于 10-09 09:37

    C++教程之函数递归调用

    C++教程之函数递归调用 在执行函数 f 的过程中,又要调用 f 函数本身,称为函数递归
    发表于 05-15 18:00 35次下载

    递归指的是在函数的定义中使用函数自身的方法

    C语言支持递归,即一个函数可以调用其自身。但在使用递归时,程序员需要注意定义一个从函数退出的条件,否则会进入死循环。递归
    的头像 发表于 11-12 15:06 7057次阅读

    C++的实验教程之函数递归算法资料免费下载

    函数递归算法 1.范例:求组合数, 一、实验目的1. 学会解决简单的递归算法。2. 掌握函数的嵌套调用。
    发表于 01-29 10:51 2次下载
    C++的实验教程之<b class='flag-5'>函数</b>的<b class='flag-5'>递归</b>算法资料免费下载

    C语言-内联函数递归函数、指针函数

    这篇文章介绍C语言的内联函数递归函数函数指针、指针函数、局部地址、const关键字、extern关键字等知识点;这些知识点在实际项目开发
    的头像 发表于 08-14 10:03 1630次阅读

    递归代码都转为非递归可以吗

    之所以所有的递归都能转为迭代算法是因为递归借助函数调用,函数调用本身就是基于调用栈这种结构实现的,只不过这一切都是自动完成的,我们当然也可以用代码手动模拟出来。
    的头像 发表于 02-17 14:35 703次阅读
    <b class='flag-5'>递归</b>代码都转为非<b class='flag-5'>递归</b>可以吗

    Python支持递归函数

    Python支持递归函数——即直接或间接地调用自身以进行循环的函数递归是颇为高级的话题,并且它在Python中相对少见。然而,它是一项应该了解的有用的技术,因为它允许程序遍历拥有任意
    的头像 发表于 02-21 14:28 609次阅读

    函数递归-3

    程序调用自身的编程技巧称为递归(recursion)。递归作为一种算法在程序设计语言中广泛应用。一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个
    的头像 发表于 02-21 15:57 542次阅读

    什么是Python的递归函数

    递归函数必须有终止条件。编程中,函数的调用要占用名叫栈(stack)的内存空间。调用函数时,程序会将相关的数据存储到计算机的栈里。
    的头像 发表于 02-23 10:25 1755次阅读

    C语言,你真的懂递归了吗?

    要说到递归如果不说栈的话,我觉得有点不合适,递归特点就是不断的调用同一个函数,如果这个函数没有一个递归界限,那么就是死循环了,所以讨论
    的头像 发表于 06-06 15:24 947次阅读
    C语言,你真的懂<b class='flag-5'>递归</b>了吗?

    关于C语言中的递归

    递归指的是在函数的定义中使用函数自身的方法。
    发表于 02-26 10:34 310次阅读
    关于C语言中的<b class='flag-5'>递归</b>