C和指针之const、#define、volatile

来源:互联网 发布:手机淘宝红包怎么领取 编辑:程序博客网 时间:2024/05/17 04:03

1、const 


定义const 只读变量,具有不可变形

const int a = 100;
  编译器通常不为普通Const只读变量分配存储空间, 而是将它们保存在符号表中,
  这使得它成为一个编译期间的值,没有了存储与读内存操作,使用效率很高
  #define M3 //宏常量  const int N = 5; //此时并没有将N放入内存中  int  i = N; // 此时为N分配了内存,以后不再分配内存  int  I = M; // 预编译期间进行宏替换,分配内存  int J = N;  // 没有内存分配  intJ = M    //再次进行宏替换,有一次分配内存

   const int *p; //p可变,p指向的对象不可变   int const *p;  //p可变,p指向的对象不可变    int *const p;   //p不可以变,p指向的对象可变   const int *const p; //p不可以变,p指向的对象不可变


 const和#define区别

   1、const 给出了对应的内存地址,不像#define一样给出的是立即数,const定义的只读变量在程序的运行中只有一份拷贝,(因为它是全局的只读变量,存放在静态区,,而#define定义的宏常量是在内存中若干的拷贝),所以const修饰的变量只分配一次内存,那个是不是static类型修饰的数据也只分配一次内存?但是用#define修饰的变量赋值给别的变量的时候,别的变量都会分配内存,节省空间,避免不必要的内存分配,同事提高效率。
   2、#define宏是在预编译阶段进行替换,const修饰的只读变量是在编译的时候确定值
   3、const修饰的只读变量有特点的类型,#define宏没有类型。


  3、 valoatile

   理解为易变的,这个关键字声明的变量,编译器对方访问该变量的代码不再优化,从而可以提供特殊地质的稳定访问,


   int i = 0;   int j = i; //(1)语句   int k = i; //(2)语句


   在(1)(2)中,i没有被作为左值,这个从内存中取出i的值赋值给j,但是这个代码没有丢掉,
   而是在(2)中语句中继续用这个值给k赋值,编译器不会从生成的汇编代码里面重新从内存i的值

   volatile int i = 0;   int j = i; //(1)语句   int k = i; //(2)语句


   volatile告诉编译器,i是谁随时可以改变,每次使用它的时候必须从内存中取出i的值


原创粉丝点击