**静态变量:**在计算机编程领域指在程序执行前系统就为之静态分配(也即在运行时中不再改变分配情况)存储空间的一类变量。与之相对应的是在运行时只暂时存在的自动变量(即局部变量)与以动态分配方式获取存储空间的一些对象,其中自动变量的存储空间在调用栈上分配与释放。
易混:
语言无关的通用定义:与程序有着相同生命周期的变量;
c语言特有定义:以static存储类声明的变量
所有的局部变量都由系统自动分配存储空间,而所有全局变量的存储空间则以静态分配的方式获取(即静态变量)。一般来说,静态变量就是全局变量。
常量使用:静态变量可用const,constant或final等关键字标识。
c示例:
#include <stdio.h>void func( )
作用:1标识出变量的生命周期
2针对某一源文件的以static声明的文件级变量与函数的作用域只限于文件内(只在文件内可见),也即“内部连接”,因而可以用来限定变量的作用域;
extern变量:
函数和变量都有声明和定义两个写法。声明的目的是告诉别的代码这个变量的名称,而定义比声明多了一个功能,除了告知名称以外,还会为这个变量分配内存。
对于函数来说,加不加extern都没有关系,因为有函数体一定是定义,加extern也会被忽略,而没有函数体的就是声明,
int add(int a, int b); 等价于 extern int add(int a, int b);
int add(int a, int b) { return a + b; } 等价于 extern int add(int a, int b) {return a+b;}
如果是变量的话
int a; // 定义了一个变量a
extern int a; // 声明了一个变量a
变量可以有任意个声明,但是只能有一个定义,全局变量定义在多个文件中,只能有一个文件中的不加extern,其余的都必须加extern表示声明。
声明可以多次,定义只能一次。
而全局变量在外部使用声明时,extern关键词是必须的,如果变量无extern修饰且没有显式的初始化,同样成为变量的定义,因此此时必须加extern,而编译器在此标记存储空间在执行时加载如内存并初始化为0。
而局部变量的声明不能有extern的修饰,且局部变量在运行时才在堆栈部分分配内存。
关键字const:
C语言中const关键字是constant的缩写,通常翻译为常量、常数等,有些朋友一看到const关键字马上就想到了常量。事实上在C语言中const功能很强大,它可以修饰变量、数组、指针、函数参数等。
1、 修饰变量:
C语言中采用const修饰变量,功能是对变量声明为只读特性,并保护变量值以防被修改。举例说明如下:
const int i = 5;
上面这个例子表明,变量i具有只读特性,不能够被更改;若想对i重新赋值,如i = 10;则是错误的。
值得注意的是,定义变量的同时,必须初始化。定义形式也可以写成int const i=5,同样正确。
此外,const修饰变量还起到了节约空间的目的,通常编译器并不给普通const只读变量分配空间,而是将它们保存到符号表中,无需读写内存操作,程序执行效率也会提高。
2、 修饰数组
C语言中const还可以修饰数组,举例如下:
const int array[5] = {1,2,3,4,5};
array[0] = array[0]+1; //错误
数组元素与变量类似,具有只读属性,不能被更改;一旦更改,如程序将会报错。
3、 修饰指针
C语言中const修饰指针要特别注意,共有两种形式,一种是用来限定指向空间的值不能修改;另一种是限定指针不可更改。举例说明如下:
int i = 5;
int j = 6;
int k = 7;
const int * p1 = &i; //定义1
int * const p2 =&j; //定义2
上面定义了两个指针p1和p2。
在定义1中const限定的是p1,即其指向空间的值不可改变,若改变其指向空间的值如p1=20,则程序会报错;但p1的值是可以改变的,对p1重新赋值如p1=&k是没有任何问题的。
在定义2中const限定的是指针p2,若改变p2的值如p2=&k,程序将会报错;但p2,即其所指向空间的值可以改变,如p2=80是没有问题的,程序正常执行。
4、 修饰函数参数
const关键字修饰函数参数,对参数起限定作用,防止其在函数内部被修改。所限定的函数参数可以是普通变量,也可以是指针变量。