函数(下)

本文详细介绍了C语言中的变量存储类型,包括静态存储和动态存储,以及auto、register、extern和static四种类型的特性。同时,讨论了函数的嵌套调用,指出C语言不允许函数嵌套定义,但支持函数间的相互调用。此外,还通过示例阐述了函数的递归调用概念,如计算斐波那契数列的方法。
摘要由CSDN通过智能技术生成

目录

 变量的存储类型

函数的嵌套

函数的递归调用


变量的存储类型

在C语言中,变量的存储类型可分为静态存储和动态存储。

静态存储的变量:是指由系统分配固定的内存单元,并一直保持不变,直到程序结束,内存才会被释放,比如全局变量就是这种类型。

动态存储的变量:是在程序中根据需要进行动态分配内存单元,使用完毕后立即释放。

 上图就是一个c语言程序在执行时的内存分配情况。

变量的存储类型说明有4种:

auto(自动型),存储在动态存储区中,属于动态存储类型,应用最广泛,定义格式:

[auto]  数据类型说明符  变量名1,变量名2,... ,变量名n;(auto可以省略,但自动变量只能在函数内或复合语句中定义)

register(寄存器型),存储在CPU的寄存器中,其特点是不需要访问内存,直接从寄存器中读写。主要用于循环次数较多的循环控制变量及循环体内反复使用的变量,只有局部自动变量和形式参数才能定义为寄存器变量。

extern(外部型),static(静态型)。这两种都存储在静态存储区中。

外部型与全局变量是对同一类变量的两种不同角度的看法。全局变量是从它的作用域提出的,外部变量是从他的存储方式提出的。一般情况下extern可省略,但其中外部型进行外部变量说明时,extern不能省略。

静态型变量与自动型相比,静态型局部变量是在调用函数或执行复合语句之前就生成了,退出函数或复合语句仍存在,静态局部变量只能被赋一次值,当被赋初值后,以后都不能被重新赋初值。其作用域为整个程序。

函数的嵌套

在c语言中,不允许在一个函数内部再定义函数,即函数不可嵌套定义,但是允许一个函数调用另外一个函数,程序中的函数可以通过相互调用建立关系,这就是函数嵌套的含义。下面是一个调用2个函数来求1!+2!+3!+...+n!的值(阶乘和)

#include <stdio.h>
int One(int n);//对函数名为One的进行声明
int Two(int n);//声明Two函数
int main()
{
    int n=0;
    scanf("%d",&n);
    printf("%d",One(n));
    return 0;
}
int One(int n){//定义一个One函数
	int sum=0;
	for(int i=1;i<=n;i++)
	{
	 sum+=Two(i);
    }
    return sum;返回sum的值给main函数
}
int Two(int n){//定义一个Two函数
	int m=1;
	   for(int i=1;i<=n;i++)
	   {
	   		m*=i;
       }
       return m;//返回m的值给One
 } 

函数的递归调用

递归调用的意思就是在一个函数体内直接或间接调用它本身,从而形成递归调用。

其中直接调用就是函数f直接调用本身;间接递归调用是指函数fa调用fb,而函数fb又调用函数fa。

著名的斐波那契数列:1 1 2 3 5 8...其意思是从第三个数开始,一个数的值等于前2个数的和

若要用程序实现,则需要用到递归调用,其中前2个数不满足条件,需要拿出来单独说。

#include <stdio.h>
int feibo(int n)//定义一个函数,名为feibo
{
 if(n==1||n==2)
  return 1;
  return feibo(n-1)+feibo(n-2);//调用自己
}
  int main()
  { 
  int n;
  	scanf("%d",&n);
  	printf("%d",feibo(n));//输出feibo函数的值
  	return 0;
  }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值