变量说明符
C 语言允许声明变量的时候,加上一些特定的说明符(specifier),为编译器提供变量行为的额外信息。它的主要作用是帮助编译器优化代码,有时会对程序行为产生影响。
const
const
说明符表示变量是只读的,不得被修改。
const double PI = 3.14159;
PI = 3; // 报错
对于数组,const
表示数组成员不能修改。
const int arr[] = {1, 2, 3, 4};
arr[0] = 5; // 报错
对于指针变量,const
有两种写法,含义是不一样的。如果const
在*
前面,表示指针指向的值不可修改。
int p = 1
const int* x = &p;
(*x)++; // 报错
如果const
在*
后面,表示指针包含的地址不可修改。
int p = 1
int* const x = &p;
x++; // 报错
static
static
说明符对于全局变量和局部变量有不同的含义。
(1)用于局部变量(位于块作用域内部)。
static
用于函数内部声明的局部变量时,表示该变量的值会在函数每次执行后得到保留,下次执行时不会进行初始化,就类似于一个只用于函数内部的全局变量。由于不必每次执行函数时,都对该变量进行初始化,这样可以提高函数的执行速度。
说人话就是我们在块作用域里面,比如说函数体里面定义了一个变量a,每次调用函数的时候他都会在内存中开辟一块区域指定为a,函数调用结束再把这块内存指定清除。而如果我们加了static这个说明符,调用函数完他就不会把这块内存指定清除,下一次直接用。
(2)用于全局变量(位于块作用域外部)。
static
用于函数外部声明的全局变量时,表示该变量只用于当前文件
,其他源码文件不可以引用该变量,即该变量不会被链接(link)。
extern
extern
说明符表示,该变量在其他文件里面声明,没有必要在当前文件里面为它分配空间。通常用来表示,该变量是多个文件共享的。
extern int a;
上面代码中,a
是extern
变量,表示该变量在其他文件里面定义和初始化,当前文件不必为它分配存储空间。
但是,变量声明时,同时进行初始化,extern
就会无效。
// extern 无效
extern int i = 0;
// 等同于
int i = 0;
上面代码中,extern
对变量初始化的声明是无效的。也就代表分配了内存空间给这个文件的变量i。无效的原因是为了防止多个extern
对同一个变量进行多次初始化。都初始化,谁知道选哪个为最终初始化的结果?
被extern的变量在最先开始声明的时候可以不用加extern
比如我有两个文件一个名叫main.c另一个是load.c
main.c
#include "load.h"
extern int a;
load.c
int a=10;