【C语言】类型限定词

ANSI C 的类型限定词有const、volatile以及restrict三个,以下分别介绍三个限定词:

1、类型限定词const

(1)、如果变量中带有const关键字,则该变量无法进行赋值、增量及减量运算来修改改变量的值

例如:  const int nochange;    //把nochange限定为常量

     nochange = 12;      //不允许

但是可以初始化:const int nochange = 12;    //这是允许的

(2)、在指针和参量中使用const:

1     const float * pf;      //pf可以改变,但pf指向的值不可改变
2     float * const pf;      //pf只能指向一个唯一的地址,不可改变,但pf指向的值可以改变
3     const float * const pf;    //pf与pf指向的值都不可改变  

    结论: 当 * 在const之前,意思是不变的是pf,也就是一个常量指针,表示pf不可变,pf指向的值可变;

        当 * 在const之后,意思的是不变的是(*pf),所以pf可变,但pf所指向的值不可变。

(3)、对全局变量使用const:有两种情况

  a、在一个文件中定义声明,在另一个文件中进行引用声明(关键词extern):

1 //file1.c   定义一个全局常量
2 const double PI = 3.14
3 const char * MONTHS[12] =
4         {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
5 
6 // file2.c      使用在其他文件中定义的全局常量
7 extern const double PI;
8 extern const * MONTHS[];

  b、将常量放在一个include文件中,这是必须使用静态外部存储类:

 1 //constant.h   定义一些全局常量
 2 static const double PI = 3.14
 3 static const char * MONTHS[12] =
 4         {"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"};
 5 
 6 // file1.c      使用在其他文件中定义的全局常量
 7 #include "constant.h"
 8 
 9 // file2.c      使用在其他文件中定义的全局常量
10 #include "constant.h"

    注:使用头文件的好处就是不必惦记着在一个文件中进行定义声明,在下一个文件中进行引用声明:全部文件都包含在一个头文件中;缺点就是在于复制数据,若数据很大,这就回造成问题了

2、类型限定词volatile:

  限定词volatile告诉编译器,该变量除了可被程序改变外,还可以被其他代理改变。

  一个值可以同时被const和volatile修饰,表示不能由程序改变,但是可以被其他代理改变:

    例如:volatile const int loc;    //volatile和const 的顺序无所谓

3、类型限定词restrict:

  关键字restrict允许编译器优化某几种代码以增加计算支持;它只可用于指针,并表明指针是访问一个数据对象的唯一且初始的方式。

  例如:int * restrict restar = (int *) malloc(10 * sizeof(int));  //指针restar是访问malloc()分配内存的唯一且初始化的方式

  例如:

1 int arr[10];int * par = arr;
2 for (n = 0; n < 10; n++){
3     restar[n]+=5;
4     arr[n]+=3
5     restar[n]+=3;
6     par[n]*=2; arr[n]+=5;
7 }

  其中restar是访问它所指数据块的唯一初始方式,所以可以用 restar[n]+=8代替。但是arr就不能,因为它不能确定有没有其他的指针改变了该处的值。

猜你喜欢

转载自www.cnblogs.com/TsnTse/p/9074968.html
今日推荐