一、static:变量空间独立与函数中的auto变量或者栈变量,static变量空间在内存中的静态区内分配。
1.修饰局部变量:
一般情况下,局部变量是存放在栈区的,并且局部变量的生命周期在该语句执行结束时便结束了。但是如果用static进行修饰的话,该变量便存放在静态数据区,其生命周期一直持续到整个程序执行结束为止。
注意:其作用域没有改变,仍然是一个局部变量。
2.修饰全局变量:
对于一个全局变量,它既可以在本源文件中被访问,也可以在同一个工程的其他源文件中被访问,(只需用extern进行声明即可).
3.修饰函数:
与修饰全局变量大同小异,就是改变了函数的作用域。
二.extern
当我们在本文件里试图用一个外部声明的全局变量或函数时,可以在其前面加上extern,表示它是外来的。
1.extern变量名
在任何函数体外声明和定义变量时,如果有extern肯定是声明.
2.extern函数
再用extern声明变量时,可以不指定类型。
三.const(只要一个变量前面用const来修饰,就意味着该变量里的数据可以被访问,不能被修改。)
解除const的迷惑性:
1.将类型去掉
2.看const秋是谁,谁就拥有了铁布衫,谁的值就是不能修改的.
四.auto:当前变量的作用域为当前函数和代码段的局部变量,意味着当前变量会在内存栈上进行分配。
栈:先进后出。
注意:有的编译器为了提高效率,在出栈时不会进行数据清空,也就是下个函数里的变量在入栈使用该空间时,里面的数据是上一次变量操作的结果。
五.register(闪电飞刀)
1.作用:
如果一个变量被register来修饰,就意味着该变量会作为一个寄存器变量,让该变量的访问速度达到最快。
2.寄存器变量:一个变量直接引用寄存器,也就是对变量名的操作的结果是直接对寄存器进行访问。
在使用寄存器变量时,应注意:
a:待声明为寄存器变量类型应该是CPU寄存器所能接受的类型,意味着寄存器变量是单个变量,变量长度应该小于等于寄存器长度。
b:不能对寄存器变量使用取地址符“&”,因为该变量没有内存地址。
c:尽量在大量频繁操作时使用寄存器变量,且声明的变量个数应该尽量少。
六.volatile
它修饰的变量表示该变量的值很容易由于外部因素发生改变。这就要求编译器要在每次对变量进行访问时去内存里读取,从而保证数据的一致.
七.typedef与#define
#define只是简单的文本替换(有括号是加括号,无括号时就没有括号)
typedef作用范围限制在所定义的函数或者文件内。(取决于此变量定义的位置。)
八、联合体
结构体与联合体本质不同:在结构中各成员有各自的内存空间,一个结构变量的总长度是各成员长度之和,而在联合中各成员共享一段内存空间,一个联合变量的长度等于各成员中最长的长度(同样遵循对齐)。
联合体格式:union 联合名
{
成员表
};
成员表中含有若干成员,成员的一般形式为:
类型说明符 成员名
九、运算符(自己需要记的)
1.三目运算符:表达式1? 表达式2:表达式3
解释:表达式1为真执行表达式2,否则执行表达式3
2.++和--
++a//先进行加1,后进行操作
a++//先进行操作,后加1
3.左移与右移
左移:是把“<<”右边的数指定移动位数,高位丢弃,低位补0
右移:是把“>>”左边的运算数的各二进制位全部右移若干位,“>>”右边的数指定移动的位数。(有符号数:符号位跟随移动,当为正数时,最高位补0;为负数时,符号位为1,最高位是补0或是补1取决于编译系统的规定)