C语言中常用关键字
static 与 extern
static修饰变量时,该变量的存储空间转移到静态数据存储区。
一般情况下局部变量时存放在栈区的,并且其声明周期是在该语句块执行结束时便结束了。但如果用static修饰,该变量便存放在静态数据区,其生命周期一直延续到整个程序结束为止,但是其作用域并没有发生变化,依旧只作用于该语句块。对于静态的局部变量,如果没有进行初始化,它会继承之前最后一次赋予它的值,或者自动对其赋值0或空字符\0。
对于全局变量,本来是可以被同工程中所有源文件访问,只需用extern进行声明。如果用static对全局变量进行修饰,该变量的作用域将变为本源文件,其他源文件将无法访问该变量。修饰函数时的效果与修饰全局变量类似,改变了原来的作用域。
extern是指当前变量或函数不是在本源文件中声明的,它是外部变量或外部函数。当我们在一个源文件中视图去调用一个其他源文件中定义的全局变量或函数时,只需要在前面加上extern,便完成了在源文件中的声明 ,可以使用该函数或变量。
auto与register
C是面向过程的,在C代码中会出现大量的函数模块,每个函数都有其生命周期(作用域),在生命周期中声明的量通常叫做局部变量,也叫做自动变量。编译器会自动在一个局部变量前面加上一个auto,这就意味着当前变量的作用域为当前函数或代码段的局部变量,意味着当前变量会在内存栈上进行分配。
如果一个变量被register修饰,就意味着该变量会作为一个寄存器变量。其数据存储在寄存器中,而不是栈和静态数据区。同时,该变量的访问速度会变快,当一个逻辑中包含一个大循环时,循环中有几个变量要频繁操作,这些变量就可以设置为register变量。
const与volatile
const修饰只读变量,变量前面加上const,该变量中的数据就只能被访问而不能被修改。除了一些基本类型,const也可以修饰一些构造类型和指针及其集合体。在区分时,只需要将语句的中类型如int char 等去掉,剩下的部分就是const修饰的部分。
volatile修饰的对象在编译时会百分之百的被访问和读取,即使是一个无用的变量或者赋值,被volatile修饰过就不会像一般的时候被忽略和跳过。简而言之就是防止编译的时候被省略(优化)。
typedef与define
typedef可用于定义一种类型的别名,而不只是简单的宏替换,#define只是定义了字符串。除了给变量起一个简单易记且意义明确的新名字外,也可以用来简化一些比较复杂的类型声明。
#define 宏名 [宏体]——用指定标识符(宏名)去代替字符序列(宏体),仅仅是替换了字符串,其作用域是定义命令开始到文件结束,使用#undef可以终止宏名的作用域。
sizeof()
sizeof()可以用来获取变量的字节长度,比如
int a[100]
printf("%d",sizeof(a)/sizeof(int));
就可以将数组a的字节长度以10进制表示出来。