目录
1.const(恒常性)
2.volatile
3.restrict
1.const(恒常性)
如果我们想处理一个基本类型时,我们可以选择传递类型变量值或类型变量的地址。但有的时候我们传入地址但不想让其修改地址上面存储的值,那么就可以用到const。
这个时候const的作用就到了。这里const位置不同,所造成的效果也不同
1: 开头
Const int * ar
ar指针所指向内容的值无法修改,但可以修改ar指向的地址
2:后面
Int * const ar
ar指针指向的地址无法修改,但地址的值可以修改
3:前面后面都有
Const int * const ar
ar指针指向的地址无法修改,且地址的值也无法修改
这里要记住
1.可以把const数据或非const数据的地址初始化为指向const的指针或为其赋值是合法的(保证赋值过来地址上面的值都不会被修改)
2.非const数据只能赋给普通指针(如果把cosnt数据给到一个普通指针,那么指针就可以对该地址上面的值进行修改)
可以发现系统不会让你修改x,z存储地址上的值
这里可以看到系统不允许你修改指向x存储的值
2.volatile
volatile限定符告知计算机,代理(而不是变量所在的程序)可以改变变量的值。通常,它被用于硬件地址以及在其他程序或同时运行的线程中共享数据
这个概率你可能不太理解,我们先来看个举例
Val1 = x;
Val2 = x;
以上代码使用两次x,但并未改变它的值。于是编译器把x的值临时存储在寄存器中。然后在val2需要使用x时,才从寄存器中(而不是原始内存位置上)读取x的值。以节约时间,这个过程被称为高速缓存。通常,告诉缓存是个不错的优化方案,但是如果一些其他代理在以上两条语句之间改变了x的值,就不能这样优化了。如果此时没有volatile关键字,编译器就不会知道这种事情发生。因此如果声明没有volatile关键字,编译器会假定变量的值在使用过程中不变,然后在尝试优化代码
可以同时使用const和volatile关键字
Volatile const int loc;
3.restrict
restrict关键字允许编译器优化某部分代码以更好地支持计算。它只能用于指针,表示该指针是访问数据对象的唯一且初始的方式。
Int ar[10];
Int * restrict restar = (int *) malloc(10 * sizeof(int));
Int * par = ar;
指针restar是访问由malloc()所分配内存的唯一且初始的方式
而指针par既不是访问ar数组中的数据的初始方式,也不是唯一的方式,所以不用把它设置为restrict
好了朋友们我们今天的内容到这就结束了,今天的内容到这里就结束了,如果有啥不会的朋友记得论坛里面提问哈~
如果朋友你感觉文章的内容对你有帮助,可以点赞,关注文章和专栏以及关注我哈,嘿嘿嘿我会定期更新文章的,谢谢朋友你的支持哈