C语言小笔记

函数的递归调用:函数调用其本身,或者其子函数还调用此函数,那么称为函数的递归调用。

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
上图里cb内存开辟时间和销毁内存时间一样。

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的话也是一样的道理

评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值