函数与递归-2

描述

书接上回内存内存

上期主要是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语言在执行时是从上到下依次执行的。如果不事先声明的话,在函数位于主函数后面的情况下去运行,程序就会报错。

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

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

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

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分