让人哭笑不得的“变量”,以C语言为例细讲
变量的生存期:就是指变量从其空间被开辟,到该空间被释放所经历的时间,反映了变量的时间作用范围。
变量的作用域:就是指变量在程序中能够起作用的地域范围,反映了变量的空间作用范围。
局部变量:在函数内定义的变量为局部变量。(内部变量)
特点1:只在本函数内有效,在其它函数中都不能直接使用。
特点2:局部变量如果在定义时未赋初值,其初值为随机值,这个随机值可以看做是系统自动为其赋的。(如果你了解定义一个变量就是给它分配了一块内存,但是因为没有初始化,所以这块内存里的值你是不知道的,可能是你以前赋过的值,也可能是某些程序运行是产生的,所以一般都认为其值是无法预料的。)
特点3:不同的函数中可使用同名变量。它们互不干扰。形参和实参也可以同名。
实参(argument):
全称为"实际参数"是在调用时传递给函数的参数. 实参可以是常量、变量、表达式、函数等, 无论实参是何种类型的量,在进行函数调用时,它们都必须具有确定的值, 以便把这些值传送给形参。因此应预先用赋值,输入等办法使实参获得确定值。
形参(parameter):
全称为"形式参数" 由于它不是实际存在变量,所以又称虚拟变量。是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传入的参数.在调用函数时,实参将赋值给形参。因而,必须注意实参的个数,类型应与形参一一对应,并且实参必须要有确定的值。
特点4:函数执行结束后,变量空间被回收。
全局变量(外部变量):在函数外定义的变量。
特点一:作用范围是“全局的”,从它定义处开始到本源程序文件末尾的所有函数都共享此变量。
特点二:如定义时未赋初值,处置自动为0,而不是随机数。(全局变量的屏蔽,即局部变量和全局变量所使用的变量名一样时,在定义局部变量的函数中将会自动使用局部变量的值而屏蔽全局变量所带来的干扰。)
全局变量的生存期和作用域
生存期:起始于整个程序的开始运行,终止于整个程序的运行结束,全局变量的空间在整个程序运行期间一直存在。
作用域:起始于变量的定义处,终止于本源程序文件末尾,这个范围内的所用函数均可共享使用该变量。(全局变量的作用域有一个限制,就是只能从变量的定义之处之后才能被使用。但是这个限制可以用extern来解决,用extern 来声明全局变量后,不管该变量是在什么位置定义的,在全局范围内都能使用。extern不能在定义全局变量的时候使用,不然会导致变量未定义的错误。)
(1) 声明:不分配内存,可出现多次;
(2) 定义:分配内存,写出执行语句,只能出现一次。
(函数定义前加extern或不写extern,都表示该函数允许被其他文件调用。)
(在全局变量或函数定义前加static,可限制只能在本文件中使用,不允许在其他文件中使用)
允许被其他文件调用的函数称为外部函数,不允许被其他文件调用的函数称为内部函数。
Notice:当一个C程序由多个源文件组成时,注意多个源文件组成的是一个程序,而不是多个程序。因此有且仅有一个源文件中有main函数。
变量的存储类型:变量不仅有数据类别,还有存储类别,存储类别用来表示变量在计算机中的存储位置,分别为(1)内存动态存储区(2)内存静态存储区(3)CPU寄存器。存储在不同位置的变量有不同的生存期,反映了变量在时间上的作用范围,类似与局部变量和全局变量反映了变量在空间上的作用范围。
auto int a ; static int b; register int c
(位于CPU寄存器中的变量是没有在内存中的,当然也没有地址,因此不能对其用&取地址。
局部变量和全局变量的存储类别:
(1) 全局变量:只能是static型的,即只能位于内存静态存储区。
(2) 函数中,或{}中的局部变量:可以是auto、static或register型的
(3) 函数的形参:可以是auto或register型的,不能为static型
Notice:在定义全局变量时,有无static都是静态的,如有static则是另外的含义,它表示不允许被其他源文件使用。
预编译处理(也称为编译预处理,就是在编译之前所做的工作):有三类,①包含文件(#include)\②宏定义(#define、#undef(用来取消先前的宏定义))\③条件编译(#if,#elif,#else,#ifdef,#ifndef,#endif)。(编译系统一遍都是把预编译、编译两个阶段一起完成,因此在上机操作时一般我们感觉不到预编译的存在。)
宏展开:文本替换,不会计算(可以将其看做是一种纯文本的替换,没有任何的计算过程)
文件包含命令是#include。文件包含是指将另一文件的内容包含到当前文件的#include命令的地方,取代#include命令行。如同将另一个文件打开、全选、复制,再到#include命令的地方粘贴一般。(< >表示所包含的文件位于系统文件夹中,“ ”表示位于用户文件夹中(一般与本C源程序同一文件夹),当使用“ ”若在用户文件夹中没有找到要包含的文件,计算机会自动再去系统文件夹中查找。)
条件编译:#if,#elif,#else,它们用于判断某个条件是否成立,决定是否进行编译。#if,#elif,#else,都要以#endif作为结束
#ifndef,#endif专门用于“符号是否被#define定义过”这类条件。#ifndef表示某个符号被定义过就执行。#endif表示某个符号未被定义过就执行
最后附上一张imindmap帮助大家整理一下思维与方便理解与记忆。