目录
变量的存储类型
在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;
}