shsh1.局部变量
2.全局变量
3.标识符的作用域与可见性
3.1
全局作用域:全局变量的生效范围为整个程序;
局部作用域:局部变量的生效范围只在“{}”内。
注意:尽量用参数传参,不用全局变量,降低耦合性;
C语言所有函数名都是全局作用域;
全局变量处在全局区(静态区);
全局变量未初始化,则输出一定为0。
3.2 变量的生存期:变量从诞生到销毁的时间
静态生存期:变量生存期与程序运行周期相等,一般全局区里的变量和由static修饰的局部变量都是静态生存期;
动态生存期:变量生存期与函数执行周期相等,一般栈区里的变量都是动态生存期,即局部变量。
3.3 static
在局部变量前加static,则局部变量具有静态生存期,存储在静态区(全局区),但仍然是局部作用域,如下例:
输出结果为两个11;
在全局变量或函数前加static,表示只能在本文件中使用,在其他地方即使声明了也无法使用。
3.4
局部作用域之间存在包含关系,所有局部作用域包含在全局作用域中
可见性有以下4个规则:
1.标识符先定义再使用;
2.同一作用域中不得出现同门标识符;
3.在没有包含关系的不同作用域中定义的同名标识符互不影响;
4.在两个或多个具有包含关系的作用域中定义的同名标识符,外层标识符在内层不可见,如以下例子:
输出100
3.5 auto
auto int i;指自动变量,自动开空间销毁空间,一般隐藏不写,函数自带;
堆区不是自动,要自己去申请调用销毁。
3.6 register
register int i;指把i的空间开在寄存器中,读取速度更快。但此关键字只是建议,不是命令,会根据实际情况选择是否执行。
3.7
头文件只放声明,不放定义!,头文件不参与编译,一般形式为#include “文件名.h”,如以下例子:
3.8 extern
如上例,全局变量的声明会分不清声明和定义,所以有extern,表面后面是声明而非定义,所以头文件(右上)可以写成extern int a;extern int b;声明时不能初始化!
4.预处理命令
傻瓜式文本替换!
4.1 宏定义
不带参数
宏定义后面不加“;”,否则会编译错误;
printf("%d\n", __LINE__);表示输出当前行数;
printf("%s\n", __file__);表示输出对应的文件;
带参数
如:#define ADD(a,b) a + b
printf("%d\n", ADD(10,20));输出30
但它和函数不同,没有保护恢复现场,是对参数的展开;但它的效率比函数高,可是没有复用行
4.2.#include
#include "绝对路径"(也可以用<>)
但相对路径用<>是相对系统所给的文件;用""是相对文件所在目录
stdio.h可以包含在文件.h中,也能包含在文件.c中,但能包含在文件.c就文件.c
4.3条件编译
#if 0
#end if
0为假,所以下面的程序无效,若换为1,则为真,下面的程序有效
#define k
#ifdef k
程序段1
#endif
表示定义过标识符k则程序段1有效,否则无效
#ifndef 标识符
#endif 与上面相反
所以,创建头文件时的标准格式为:
#ifndef _文件名_H
#define _文件名_H
末尾加上#endif
防止对同一个头文件重复包含时重复定义。