赞
踩
函数的递归调用:函数调用其本身,或者其子函数还调用此函数,那么称为函数的递归调用。
int fac( int n ); int main( void ) { int m = 0; printf( "请输入m的值:" ); scanf( "%d",&m ); printf( "%d\n",fac(m) ); return 0; } //函数的功能:求n的阶乘 int fac( int n ) { if( n < 1 )//形参的异常检查 return -1;//返回异常值 else if( n==1 ) return 1; else return n*fac(n-1) }
作用域:
作用域是在运行时代码中的某些特定部分中变量,函数和对象的可访问性。换句话说,作用域决定了代码区块中变量和其他资源的可见性。作用域就是一个独立的地盘,让变量不会外泄、暴露出去。也就是说作用域最大的用处就是隔离变量,不同作用域下同名变量不会有冲突。
在同一个作用域不能出现相同的标识符,同一个作用域内,不能重复定义变量名
文件作用域:从文件头到文件尾的代码空间。
函数作用域:函数的参数和函数体属于函数作用域,函数的返回值和函数名属于文件作用域。
语句块作用域:
结构体作用域:
存储类别:存储类别解决的是标识符”生命周期“或者变量内存的开辟时间和销毁时间;学习存储类别时不要去考虑作用域,俩者没有关系
栈变量:auto声明的变量。
变量内存开辟时间:栈变量是在执行到变量定义语句时开辟内存。
变量内存销毁时间:所在作用域结束后销毁。
栈变量:
注意,虽然foo(20)调用时重新开辟内存块,但是和之前的开辟内存是不一样的;
自动变量存储在堆栈
静态变量存储在静态内存
所有的全局变量都是静态变量
所有的局部变量默认是自动变量,栈变量
被关键字static修饰的局部变量也是静态变量
全局区变量:用static声明的变量
注意形式参数不能声明为static,只能声明为auto;变量声明为static时,不赋初值默认为0;
全局标识符如果用static修饰,并不是表示在全局区而是表示该标识符只能在本文件内被扩展使用
变量内存开辟时间:编译时
变量内存销毁时间:主函数结束时
结果:2 2
结果:2 3
上图里c和b内存开辟时间和销毁内存时间一样。
example:有俩个.c文件,一个是fun.c,另一个是main.c
#include <stdio.h>
int max = 0;
void fac( void ){
max = 20;
printf("*****");
}
#include <stdio.h> extern void fac(void);//函数声明,扩展作用域,把fac函数从fun.c扩展到了这里;只是大多数时候,我们写声明的时候没有写extern extern int max;//把变量max的作用域从fun.c扩展到了这里 注意这里不能用int max,因为俩个.c文件都全局变量的话会产生冲突 extern int c;//扩展作用域 void fun( int a ); int main(void) { fac(); max = 100; return 0; } int c = 10;//全局变量 void fun( int a )//局部变量 { static int b;//局部变量 }
全局标识符如果用static修饰,并不是表示在全局区而是表示该标识符只能在本文件内被扩展使用。意思是如果fun.c里的函数改为,**static void fac(void)**则报运行错误,因为fac加了static之后只能在fun.c中使用,不能再扩展到其他文件中使用,当然static int max的话也是一样的道理
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。