总述
内存的用户区可以分为三部分,程序区、静态存储区和动态存储区。
静态内为三种:静态局部变量,静态外部变量,外部变量(全局变量)。
动态分为三种:自动局部变量,寄存器变量,形式参数。
函数形参
形参可以定义为自动变量或寄存器变量。
auto
局部变量默认是auto,占据动态存储区,函数调用时动态分配存储空间,调用后释放。调用一次执行一次赋初值语句,若不赋初值会是一个不确定的初值。
与之相对应的是全局变量和静态局部变量,这两种存储在静态存储区,编译时进行初始化(赋初值)且只执行这一次赋初值语句,若无赋初值语句,则系统为其赋值(0或空指针)。故其在程序运行时已经有初值,在程序运行一开始就在静态存储区内分配到固定空间,整个程序运行期间不释放。
register
用register来定义寄存器变量,一般变量都存放在内存内,但寄存器变量直接存放在CPU寄存器里面,不用再去内存存取,提高了执行效率。
只有局部自动变量和形式参数可以作为寄存器变量,局部静态变量不能定义为寄存器变量。也就是只有放在动态存储区的才有资格被定义成寄存器变量。
static
1. static定义局部变量
static定义局部变量,成为静态局部变量,仅在编译时执行一次赋初值语句。如果无赋初值,则编译时自动赋初值0或空字符。以后每次调用后用上次执行后保留的值,不再重新赋初值。
虽然静态局部变量在函数调用后仍然存在,但是其他函数不能引用它,因为它是局部变量。
2. static定义外部变量
static定义外部变量,使外部变量只能被本文件引用,不能被其他文件引用。
3. static定义内部函数
用static来定义内部函数,因为函数默认是全局的,而加static后使之只能被本文件使用,成为内部函数。
extern
1. extern定义或者声明外部函数
由于函数本质上是外部的、全局的,所以无论是定义外部函数或者想使用外部函数(即使是不同源文件)时做的声明(函数原型),都可以省略extern。
只要在使用外部函数(即使不同文件)的每一个文件中都声明该函数,即写出该函数的函数原型(可以在文件开头,也可以在函数内,也就是使用该函数前任何位置),函数原型会通知编译系统,该外部函数会在稍后定义,或在另一文件定义。
当已经使用了文件包含(包含定义该函数的)的预处理后,无需声明即可使用了。
2. extern声明外部变量
首先外部变量即全局变量,
extern声明(任何位置声明都可)一个已经定义过的外部变量(本文件内定义或其它文件定义都可),用来将该外部变量的作用域扩展至声明处。编译时遇到此声明,会先在本文件找是否有对应外部变量的定义,如果没有,就在连接时从其它文件找,并将其作用域扩展到本文件extern声明处。