【C语言】函数知识总结(2)

一、递归函数

在C语言中一个函数除了可以调用其他函数外,还可以直接或间接调用自己,这种函数自己调用自己的形式称为函数的递归调用,带有递归调用的函数也称为递归函数。

  • 直接递归调用:函数直接调用它自身
  • 间接递归调用:函数通过其他函数间接来调用它自身
  • 关键:寻找递归算法和递归的终止条件
  • 递归函数调用自己只是调用了同名同功能的函数,或者可以理解为调用的是它自己的副本。在C语言中每调用一次函数,系统都为该函数分配新的内存空间,存放运行时所需的各种变量及参数,生成一个新的函数实体,直到该函数结束,才会释放其占用的内存空间。递归时每次调用自身都会生成新的形参变量,它们虽然同名但不是同一变量

例题:输出斐波拉契数列的第n项。
在这里插入图片描述
代码:

#include<stdio.h>
long fibo(int);
int main()
{
    
    
	int n,f;
	scanf("%d",&n);
	f=fibo(n);
	printf("%d\n",f);
	return 0;
}
long fibo(int n)
{
    
    
	int f;
	if(n==1||n==2)
	   f=1;
	else
	   f=fino(n-1)+fibo(n-2);
	return f;
}

运行结果:

10
55

二、数组作函数的参数

1.把数组元素作为实参使用
2.把数组名作为函数的形参和实参使用

  • 在C语言中,数组名代表数组的首地址
  • 数组名作为函数的参数,此时形参和实参所指向的是同一块存储单元,即形参数组可以访问实参数组所在的存储单元,并且还能改变这些单元的内容,从而实参数组元素的值被改变

3.数组作为函数需注意:

  • 形参数组和实参数组的名称不要求相同但类型必须一致
  • 在函数形参表中,允许不给出形参数组的长度,可增加一个变量形参来表示数组元素的个数
    4.用数组名作函数参数与用数组元素作实参的不同:
  • 用数组元素作实参时,只要数组类型和函数的形参变量的类型一致即可
  • 数组名就是数组的首地址,因此在数组名作函数参数时所进行的传送只是地址值的传送,也就是说把实参数组的首地址赋予形参数组名。形参数组名取得该首地址后,也就指向了实参的数组。实际上是形参数组和实参数组为同一数组,共享相同的内存空间

三、局部变量与全局变量

(1)变量的作用域就是变量的有效范围,C语言只允许在3个地方定义变量:
1.函数内部的声明部分
2.所有函数的外部
3.复合语句中的声明部分
(2)局部变量:只在本函数范围内有效
1.不同函数或复合语句中可使用同名的变量,但他们不是同一变量,他们在内存中占不同的单元
2.主函数main中定义的变量只在主函数中有效。主函数也不能使用其他函数中定义的变量
3.形参也是局部变量。在函数调用时为其分配内存,退出函数时将释放所占内存
4.在一个函数内部可在复合语句中定义变量,单变量只在本复合语句中有效
5.编译系统不检查函数名与局部变量是否同名
(3)全局变量:有效范围为从定义全局变量的位置开始到该源文件结束
1.若在全局变量定义处之前的函数想引用该全局变量,则需要在该函数中用关键字extern作外部变量声明
2.同一作用域范围内只能定义一次,定义的位置在所有函数之外
3.如果全局变量与局部变量同名,则在局部变量的作用范围内,全局变量不起作用(程序对变量的引用遵守最小作用域原则)

四、变量生命期与存储类型

1.变量从定义开始分配存储单元,到运行结束存储单元被回收,整个过程称为变量生命期
2.C程序的存储分布情况
在这里插入图片描述
3.从变量的生命期来分,将变量的存储类别分为

  • 静态存储方式:指在程序运行期间分配固定的存储空间的方式
  • 动态存储方式:在程序运行期间根据需要进行动态地分配存储空间的方式

4.变量的存储类型

  • auto(自动类型)变量:定义自动变量时,auto可以省略,所以以前用到的变量都是自动变量

  • register(寄存器类型)变量:它也是自动变量,与auto型变量的区别在于register变量的值存放在寄存器中二不是在内存中

  • static(静态类型)变量:该变量的存储单元被分配在数据区的静态存储区中。如果函数中的局部变量的值在函数调用结束后仍然能保留,便于下一次调用该函数时使用,可以将局部变量定义为static类型

  • extern(外部类型)变量:即外部变量,是在程序中声明已在函数外部定义过的全局变量

  • 对于静态局部变量和自动变量需注意:
    1.静态局部变量在编译时赋初值,即只赋一次初值;而自动变量赋初值是在函数调用时进行,每调用一次函数重新赋一次初值
    2.自动变量如果没有赋初值,其初值是不确定的;若在定义静态局部变量时不赋初值,编译时系统自动赋初值0.并且赋初值只在函数第一次调用时进行,以后调用时其值为前一次调用保留的值
    3.静态局部变量和全局变量一样,属于变量的特殊用法,若没有静态保存的要求,不建议使用静态变量

五、内部函数与外部函数

1.内部函数

  • 该函数只能被本文件中其他函数所调用,又被称为静态函数。定义格式:
static 类型名 函数名(形参表);
  • 好处:函数的作用域只局限于所在文件,再由多人编写不同的程序模块时,不用担心自己所用的函数名与别人使用的是否相同,即使函数名相同,也不会产生干扰

2.外部函数

  • 该函数允许被其他文件的函数所调用。定义格式:
extern 类型名 函数名(形参表);
  • 外部函数在整个源程序中都有效,C语言规定,如果在定义函数时省略extern,则默认为外部函数
  • 外部函数定义后,要在需要调用此函数的程序文件中用extern声明所调用的函数的原型,表示该函数已在其他文件中被定义

猜你喜欢

转载自blog.csdn.net/m0_74102736/article/details/130670764