static的使用
1、全局变量(初始化和未初始化),静态变量(全局和局部) 都在静态区存放,生命周期大于主函数,进程开始时创建,进程结束时回收
2、全局变量和静态变量的作用域问题
1)全局变量的作用于就是全局,跟放置位置无关
2)静态全局变量:把修饰的变量的作用与限制在本文件中,
静态局部变量:只初始化一次,以后直接使用,声明周期贯穿整个进程
3)static修饰函数(静态函数):限制该函数只能在本文件中使用,若类成员函数为静态函数,则该函数属于整个类
const的使用
1.const 只读 限制变量的属性(常变量)
const int *p = &a; //也可以 int const *p=&a
*p =30 //出错,因为指针所指向的空间内容不能改
2. int * const m=&a;
m= &b; //出错,因为指针指向不能改
3.const int * const n=&a //此时指针指向和指针指向内容都不能改
4.变量被定义const时,两种方式可以改:
通过指针修改
强制转换变量的类型
const 与 define的区别
1.编译器处理的方式不同:
define是在预处理阶段展开,const常量是编译运行阶段使用.
2.类型和安全检查不同
define宏没有类型,不做任何类型检查,仅仅是展开替换, const常量有具体的类型,在编译阶段会执行类型检查。
3.存储方式不同
define 宏 仅仅是展开与替换,有多少地方使用,就展开多少次,预处理阶段不会分配内存;const常量定义时会在内存中分配
4. const 可以节省空间,避免不必要的内存分配:
例: #define PI=3.14 //常量宏
const double Pi=3.14; //此时并未将Pi放入内存
double a=Pi; //此时为Pi分配内存a,以后不分配;
double b=PI; //编译期间进行宏替换,分配内存b;
double c=Pi ; //不分配内存c
double d=PI; //进行宏替换,再次分配内存d
const 定义从汇编的角度来看,只是给出了对应的内存地址,而不是像#define 一样给出的是立即数,所以const常量在程序运行的时候只有一次拷贝,而#define定义的常量在内存中有若干个拷贝。
5.提高了效率:
编译器通常不为普通的const常量分配内存空间,而是将他们保存在符号表中,这使得他成为一个编译期间的常量,也没有了存储与读内存的操作,使得它的效率也很高。
6.应该注意define 替换的时候 产生的一些“边缘效应”:
例:#define N 2+3
float a=N/2; //此时我们的预想值a=2.5, 实际上 a=2+3/2 =3.5