整理今天的学习内容
1.嵌套调用和链式访问
(1)函数的嵌套调用
例:实现计算某年某月的天数
(2)链式访问
链式访问就是将一个函数的返回值作为另一个函数的参数
如:把strlen的返回值直接作为printf函数的参数
了解返回值(printf)
printf函数返回的是打印在屏幕上的字符的个数
2.函数的声明和定义
(1)单个文件
C语言编译器对源代码进行编译是从第一行往下扫描的,如果在函数调用之前没有发现函数的定义,就会报警告,为了解决这个问题,应该在函数调用之前先声明这个函数,声明函数需要交代清楚函数的返回类型,函数名,和函数的参数(相当于函数定义的第一行),函数声明中参数只保留类型,省略掉名字也是可以的
函数的定义也是一种特殊的声明,所以也可以把定义放在调用之前
(2)多个文件
一般情况下,函数的声明,类型的声明放在头文件(.h)中,函数的实现放在源文件(.c)中
3.static和extren
(1) static和extren都是C语言中的关键字
static是“静态的”的意思,可以修饰局部变量,全局变量和函数
extern是用来声明外部符号的
作用域和生命周期
作⽤域(scope)是程序设计概念,通常来说,⼀段程序代码中所⽤到的名字并不总是有效(可⽤)的,⽽限定这个名字的可⽤性的代码范围就是这个名字的作⽤域。
1. 局部变量的作⽤域是变量所在的局部范围
2. 全局变量的作⽤域是整个⼯程(项⽬)
⽣命周期指的是变量的创建(申请内存)到变量的销毁(收回内存)之间的⼀个时间段
1. 局部变量的⽣命周期是:进⼊作⽤域变量创建,⽣命周期开始,出作⽤域⽣命周期结束
2. 全局变量的⽣命周期是:整个程序的⽣命周期
(2) static修饰局部变量
结论:static修饰局部变量改变了变量的⽣命周期,⽣命周期改变的本质是改变了变量的存储类型,本来⼀个局部变量是存储在内存的栈区的,但是被 static 修饰后存储到了静态区。存储在静态区的变量和全局变量是⼀样的,⽣命周期就和程序的⽣命周期⼀样了,只有程序结束,变量才销毁,内存才回收,但是作⽤域不变的
(3)static修饰全局变量
(extern 是⽤来声明外部符号的,如果⼀个全局的符号在A⽂件中定义的,在B⽂件中想使⽤,就可以使⽤ extern 进⾏声明,然后使⽤)
结论:⼀个全局变量被static修饰,使得这个全局变量只能在本源⽂件内使⽤,不能在其他源⽂件内使⽤。本质原因是全局变量默认是具有外部链接属性的,在外部的⽂件中想使⽤,只要适当的声明就可以使⽤;但是全局变量被 static 修饰之后,外部链接属性就变成了内部链接属性,只能在⾃⼰所在的源⽂件内部使⽤了
(4)static修饰函数
其实 static 修饰函数和 static 修饰全局变量是⼀模⼀样的,⼀个函数在整个⼯程都可以使⽤,被static修饰后,只能在本⽂件内部使⽤,其他⽂件⽆法正常的链接使⽤了
本质是因为函数默认是具有外部链接属性,具有外部链接属性,使得函数在整个⼯程中只要适当的声明就可以被使⽤。但是被 static 修饰后变成了内部链接属性,使得函数只能在⾃⼰所在源⽂件内部使⽤