从变量的作用域角度来分,可以分为局部变量与全局变量。
从变量值的存在的时间(即生存期)来分,可以分为静态存储方法和动态存储方式。
所谓静态存储方式是指程序在运行期间由系统分配固定的村粗空间的方式。动态存储方式则是在程序运行期间根据需要进行动态的分配存储空间的方式。
内存供用户使用的存储空间的情况,这个存储空间可以分为三部分:
(1)程序区 (2)静态存储区 (3)动态存储区
数据分别存放在静态存储区和动态存储区中。全局变量全部存放在静态存储区中,在程序开始执行时,给全局变量分配存储区,程序执行完毕就释放。在程序执行过程中它们占据固定的存储单元,而不是动态地进行分配和释放。
在动态存储区中存放一下数据:
(1)函数形式参数,在调用函数时给形参分配存储空间。
(2)自动变量。未加static声明的局部变量。
(3)函数调用时的现场保护和返回地址等。
register声明的变量不是存放在内存中,而是存在CPU的寄存器中,如果一个变量用的频繁就可以声明一个register变量。static声明的变量只赋一个初值,以后调用函数时不再赋初值而只是保留上次函数调用结束时的值。
外部变量,它的作用域是从变量的定义处开始的,到本程序文件的末尾,在此作用域内,全局变量可以为程序中各个函数的所引用,编译时将外部变量分配到静态存储区。有时用extern来声明外部变量,以扩展外部变量的作用域!即可以先用一个未定义的变量,只要它在后面定义就好了!使用extern可以扩展它的作用。
如果用static声明外部变量,则在其它文件中用extern是无法使用到这个变量,这就是静态外部变量,只限于本文件使用,别的文件是不能使用到得。而外部变量在其它文件是可以使用到得。
作用域与生存期是不等的,一个静态局部变量只能在函数内使用,但它的生存期却是整个程序结束的时候销毁的。
默认没加extern的函数都是外部函数,加了static的函数则只能在本文件中使用。
#define S(a,b) a*b
就是说把S(a,b)定义成a*b
int* p[4]代表的是指针数组,数组里面的变量都是int型的指针。数组p【4】,然后类型为int*。
int (*p)[4]代表的是一个二维数组,*P指向的是一个一维数组,每个数组有4个整形变量。