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

    文章

    2767

    浏览量

    72766
  • 函数
    +关注

    关注

    3

    文章

    3878

    浏览量

    61309
  • 变量
    +关注

    关注

    0

    文章

    596

    浏览量

    28112
收藏 人收藏

    评论

    相关推荐

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

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

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

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

    Labview递归函数的使用案例

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

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

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

    现代C函数式编程

    和技巧,同时也体现了现代C++的强大威力和无限可能。 概述 函数式编程是一种编程范式,它有下面的一些特征: 函数是一等公民,可以像数据一样传来传去。高阶函数递归pipeline惰性求值
    发表于 09-30 16:43 2次下载

    函数式编程语言、编程和程序验证

    是1930年代在调查函数定义、函数应用和递归时研发的一个形式系统,是等价于图灵机的一种抽象的计算模型,许多函数式编程语言都可看成是在演算基础上精心制作出的结果
    发表于 04-03 11:01 3次下载

    通过PICC编译环境下,对PIC单片机程序进行操作研究

    PICC基本上符合ANSI标准,但是不支持函数递归调用,其主要原因是PIC单片机特殊的堆栈结构。PIC单片机中的堆栈是硬件实现的,其深度已随芯片固定,无法实现需要大量堆栈操作的递归算法;另外在PIC单片机中实现软件堆栈的效率也
    的头像 发表于 09-25 15:53 3391次阅读
    通过PICC编译环境下,对PIC单片机程序进行操作研究

    C++语言入门教程之C++语言程序设计函数的详细资料概述免费下载

    本文档的主要内容详细介绍的是C++语言入门教程之C++语言程序设计函数的详细资料概述免费下载内容包括了:1 函数的定义和使用2 函数的参数传递3 函数的嵌套调用4
    发表于 09-20 14:51 23次下载

    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 1370次阅读

    Python支持递归函数

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

    函数递归-1

    在我看来,如果说各种循环与分支是一个系统的骨架的话,那么形式繁多的函数就是C语言的血肉了,正是各式各样的函数决定了C语言的各种功能。那么话不多说,既然函数如此重要,那就快跟我一起了解函数
    的头像 发表于 02-21 15:50 335次阅读
    <b class='flag-5'>函数</b>与<b class='flag-5'>递归</b>-1

    函数递归-3

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

    什么是Python的递归函数

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

    递归函数计算斐波那契数列中的第n项值

    编写一个递归函数,用于计算斐波那契数列中的第n项值,并在主函数中调用该函数输出斐波那契数列的前15项。
    的头像 发表于 06-07 11:30 1897次阅读