1.const与指针

只能在初始化的时候进行赋值

const与指针搭配的时候,const位于*左边使得数据称为常量,位于右边使得指针自身称为常量。

 

  1. const float * pf1;//pf1指向一个常量浮点值,但pf本身可以改变指向 
  2. float const * pfSame1;//同上  
  3. float * const pf2;// pf2是一个常量指针,必须始终指向一个地址,但是指向的值可以改变 
  4. const float * const pf3//pf3必须指向同一个地址,而且不能更改指向的值 

2.const与全局变量

两个策略可以使用

a. 不使用头文件,在一个文件进行定义声明,在其他文件进行引用声明

 

  1. //file1 
  2. const double PI = 3.1415926 
  3. //file2 
  4. extern const double PI 
  5.   
  6.   

b. 使用头文件,将const全局变量放在其中,此时必须使用static静态外部存储类

 

  1. //constant.h 
  2. static const double PI = 3.1415926;//如果没有关键字static,导致每个文件都有同一个标识的外部链接静态变量,会产生错误  
  3. //file1 
  4. #include"constant.h"//如果有关键字static,则每个文件都有了一个独立拷贝,虽然不能通信,但是由于都是const,所以数据不变  
  5. //file2 
  6. #include"constant.h"//这种方法方便,但是空间效率变差了  

2.volatile(编译器优化)

告知编译器该变量可以被除程序外的其他代理改变。

如果没有volatile,则编译器假定一个值在使用过程中没有被修改,它会试着就该值放进寄存器中,利用缓存技术加快速度

3.restrict(编译器优化)

只用于指针,表明指针是访问一个数据的唯一且初始的方式

  1. int ar[10]; 
  2. int * restrict restar = (int *)malloc(10 * sizeof(int));//访问这片内存的唯一方式,所以支持该关键字  
  3. int * par = ar;//不是初始的,也不是唯一的访问方式,不能用restrict 
  4.  
  5. for(n=0;n<10;n++){ 
  6.     par[n] +=5; 
  7.     restar[n] +=5; 
  8.     ar[n] *= 2; 
  9.     par[n] += 3;//par则不能进行下面的优化,因为不能确定访问方式途径唯一  
  10.     restar[n] += 3;//restar可以用restar[n] += 8代替涉及restar的所有操作 
  11. }  

该限定词也可以用于函数的形参,这表明函数体内没有其他指针可以修改该指针指向的数据

 

  1. void * memcpy(void * restrict s1,const void * restrict s2,size_t n);//不能发生重叠  
  2. void * memmove(void * s1,const void * s2,size_t n);//可以发生重叠 ,有可能会覆盖数据  

4.旧关键词