#define,const ,static 的使用总结

来源:互联网 发布:dts hd mac 编辑:程序博客网 时间:2024/06/03 12:29

static的使用

1.全局变量(初始化和未初始化),静态变量(全局和局部)  都在静态区存放。

   生命周期大于主函数,进程开始时创建,进程结束时回收
2.全局变量和静态变量的作用域问题
    (1)全局变量的作用于就是全局,跟放置位置无关
    (2)静态全局变量static :把修饰的变量的作用与限制在本文件中,
             静态局部变量        :只初始化一次,以后直接使用,声明周期贯穿整个进程
     (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的 区别(c语言中)

 1.编译器处理的方式不同:

               define是在预处理阶段展开,const常量是编译运行阶段使用.

 2.类型和安全检查不同

              define宏没有类型,不做任何类型检查,仅仅是展开替换, const常量有具体的类型,在编译阶段会执行类型检查。

 3.存储方式不同

              define 宏 仅仅是展开与替换,有多少地方使用,就展开多少次,预处理阶段不会分配内存, const常量定义时候会在内存中分配(可以是 堆,栈)

 4. const 可以节省空间,避免不必要的内存分配:

              例: #define PI=3.14                                            //常量宏

                       const  double  Pi=3.14;                             //此时并未将Pi放入ROM中

                        double  a=Pi;                                            //此时为Pi分配内存,以后不分配;

                        double  b=PI;                                             //编译期间进行宏替换,分配内存;

                        double  c=Pi ;                                            //不分配内存

                        double   d=PI;                                            //进行宏替换,再次分配内存

              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

0 0