1.局部变量和全局变量
1.局部变量 (在栈区)
在一个函数内部定义的变量是内部变量,它只在本两数范围内有效,也就是说只有在本函数内才能使用它们,在此函数以外是不能使用这些变量的。这称为“局部变量”。
说明:(1)主函数中定义的变量(m,n)也只在主丽数中有效,而不因为在主函数中定义而在整个文件或程序中有效,主函数也不能使用其伦函数中定义的变量。
(2)不同函数中可以使用相同名字的变量,它们代表不同的对象,互不干扰。
(3)形式参数也是局部变量。
(4)在一个函数内部,可以在复合语句中定义变量,这些变量只在本复合语句中有效,这种复合语句也称为“分程序”或"程序块”。
2.全局变量 (在全局区)
在函数之外定义的变量称为外部变量,外部变量是全局变量(也称全程变量)。全局变量可以为本文件中其他函数所共用。它的有效范围为从定义变量的位置开始到本源文件结束。
说明:(1)设置全局变量的作用是增加了函数间数据联系的渠道。
(2)建议不在必要时不要使用全局变量。 原因如下:
①全局变量在程序的全部执行过程中都占用存储单元,而不是仅在需要时才开辟单元。
②它使函数的通用性降低了。
③使用全局变量过多,会降低程序的清晰性。
四条规则:1.标识符必须先定义在使用。
2.在同一作用域中,不得定义同名标识符。
3.在没有包含关系的作用域中定义的同名标识符互不影响。
4.在两个或两个具有包含关系的不同作用域中定义的同名标识符,外层标识符在内层不可见。
2.变量的生存期
静态生存区:在程序运行期间由系统分配固定的存储空间。 有全局变量、static局部变量。(在静态区)
动态生存区 :在程序运行期间根据需要进行动态的分配存储空间。 有局部变量。(在栈区)
1.auto变量 (自动分配存储空间,自动销毁)
2.static变量 在局部变量前加static,作用是将局部变量的生存期有动态生存期变为静态生存期
说明:(1)静态局部变量属于静态存储类别,在静态存储区内分配存储单元。在程序整个运行期间都不释放。
(2)对静态局部变量是在编译时赋初值的,即只赋初值一次,在程序运行时它已有初值。
(3)如在定义局部变量时不赋初值的话,则对静态局部变量来说,编译时自动赋初值0。
(4)虽然静态局部变量在函数调用结束后仍然存在,但其他函数是不能引用它的。
3.register变量 (寄存器变量)
c语言允许将局部变量的值放进cpu的寄存器中,因为寄存器的存取速度远高于对内存的存取速度,这样做可以提高执行效率。用关键字rigister做声明。
说明:(1)只有局部自动变量和形式参数可以作为寄存器变量,其他(如全局变量)不行在调用一个函数时占用一些寄存器以存放寄存器变量的值,函数调用结束释放寄存器此后,在调用另一个函数时又可以利用它来存放该函数的寄存器变量。
(2)一个计算机系统中的寄存器数目是有限的,不能定义任意多个寄存器变量。不同的系统允许使用的寄存器个数是不同的,而且对register 变量的处理方法也是不同的,有的系统对register变量当作自动变量处理,分配内存单元,并不真正把它们存放在寄存器中,有的系统只允许将int、char和指针型变量定义为寄存器变量。
(3)局部静态变量不能定义为寄存器变量。不能写成register statie int a,b,c.
在函数和全局变量前加static,会限制函数和全局变量只能自己使用。
4.extern变量
若被调函数放在主调函数之后,需要先对该函数进行声明。调用外部函数时,也要先对该函数进行声明。
头文件只放声明,不放定义。声明的时候,形参可以被省略。
3内部函数和外部函数
内部函数:如果一个函数只能被本文件中其他函数所调用,它称为内部函数。在定义内部函数时,在函数名和函数类型的前面加static。用内部函数,可以使函数的作用域只局限于所在文件。
外部函数:在定义函数时,如果在函数首部的最左端加关键字 extern,则表示此函数是外部函数,可供其他文件调用。在需要调用此函数的文件中,用extern对函数作声明,表示该函数是在其他文件中定义的外部函数。
vsp :水平开窗口。
set mouse = a :随意移动鼠标 sp 垂直开窗口
4.预处理命令
1.宏定义
1.不带参数的宏定义
宏名一般习惯用大写字母表示,宏定义是用宏名代替一个字符串,也就是作简单的置换,不作正确性检查。末尾不加分号。
2.带参数的宏定义
对带参数的宏的展开只是将语句中的宏名后面括号内的实参字符串代替。
2.文件包含处理 (#include)
编译时并不是对两个文件分别进行编译,然后再将它们的目标程序连接的,而是在经过编译预处理后将头文件format.h包含到主文件中,得到一个新的源程序,然后对这个文件进行编译,得到一个目标(.obj)文件。被包含的文件成为新的源文件的一部分,而单独生成目标文件。
#include文件包含命令,相当于把包含文件内的内容复制到c文件中。
在/uer/include绝对路径下用<> 在c文件下用 “ ”。
3.条件编译
如果没有定义宏名,程序段1无法执行。
如果定义了宏名,程序段1无法执行。