C中的const和volatile指针有什么区别?
答案 0 :(得分:16)
差异实际上归结为const
和volatile
之间的差异。这两个概念的共同点就是语法。 const
是编译器强制执行的并且说“程序员不能改变它”。 volatile
表示“此数据可能会被其他人更改”,因此编译器不会对该数据做出任何假设。如果没有volatile
,编译器可能会说“我将这些数据从内存放入寄存器,因为我没有对该数据做任何事情,我确信它是相同的,我不需要将它读入再次注册。“当数据标记为volatile
时,编译器不会做出这样的假设(因为其他人可能已经更改了数据),因此它会将数据重新读入寄存器。
现在,您是否要求
之间的区别int *const p;
和
int *volatile q;
或
之间的区别const int* p;
和
volatile int* q;
在前一种情况下:p
是指向int
的指针,程序员不能更改指针指向,而q
是指向int
的指针并且程序员以外的其他人可以更改指针指向的位置,因此编译器不会对该指针做出任何假设。
所以:
int *const p = (int*)malloc(sizeof(int));
int *volatile q = (int*)malloc(sizeof(int));
*p = 17; // legal;
p = (int*)malloc(sizoef(int)); // not legal
*q = 17; // legal;
q = (int*)malloc(sizeof(int)); // legal
在后一种情况下:p
是指向int
的指针,程序员无法更改p
所指向的内容,而q
是指向int
的指针一个q
以及int i = 17;
int j = 34;
const int *p = &i;
volatile int *q = &i;
*p = 51; // not legal
p = &j; // legal
*q = 51; // legal
q = &j; // legal
所指向的内容可能会被程序员以外的其他人更改,因此编译器不会对该数据做出任何假设。
{{1}}
答案 1 :(得分:2)
通常,const
或volatile
适用于指针,而非指针本身。
const
表示不允许您通过该指针修改指针。
volatile
表示某人/其他人可能会修改指针,即使您的代码没有。这也意味着写入变量可能不仅仅是存储一个值,以便在下次使用该变量时进行检索。因此,只要您的代码读取或写入易失性值,编译器就必须生成从实际内存中读取(或写入)的代码,而不仅仅是(例如)分配临时使用的寄存器,以及读取/写入登记册。
编辑:请注意,即使您不允许通过const
指针修改数据,仍可通过其他方式修改数据。事实上,有时你可以拥有const
和 volatile
的指针,这意味着你无法改变它,但其他人可能会改变它。
答案 2 :(得分:1)
以下是对这两个概念的解释
const关键字指定初始化后不能修改指针;之后保护指针不被修改。
volatile关键字指定与后续名称关联的值可以通过用户应用程序中的操作以外的操作进行修改。因此,volatile关键字对于声明共享内存中的对象非常有用,这些对象可以被多个进程或用于与中断服务例程通信的全局数据区访问。
它来自here
答案 3 :(得分:1)
const指针(即const char* s = ..
)指向不可以修改的数据。易失性指针(即volatile char* s = ...
)暗示编译器不要缓存指针在CPU寄存器或其他地方引用的数据。相反,它们每次需要时都会从原始内存位置重新读取。如果数据的内容可能在编译器的范围之外发生变化,例如通过修改它的第二个线程,则需要这样做。
请注意,const char*
和char* const
是不同的内容,volatile
限定符相同。如果您不确定,请查看它们。