C中的const和volatile指针有什么区别?
C中的const和volatile指针有什么区别?
差异实际上归结为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
指向的是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
通常, const
或volatile
适用于指针,而不是指针本身。
const
意味着你不允许通过该指针修改指针。
volatile
意味着某人/其他人可能会修改指针,即使你的代码没有。 这也意味着写入变量可能不仅仅是存储下次使用该变量时要检索的值。 因此,只要您的代码读取或写入易失性值,编译器就必须生成从实际内存中读取(或写入)的代码,而不仅仅是(例如)分配临时使用的寄存器,以及读取/写入登记册。
编辑:请注意,即使您不允许通过const
指针修改数据,仍可以通过其他方式修改数据。 实际上,有时你可以拥有一个const
和 volatile
的指针,这意味着你无法改变它,但其他人可能会改变它。
这是对这两个概念的解释
const关键字指定初始化后不能修改指针; 此后保护指针不被修改。
volatile关键字指定与后续名称关联的值可以通过用户应用程序中的操作以外的操作进行修改。 因此,volatile关键字对于声明共享内存中的对象非常有用,这些对象可以由多个进程或用于与中断服务例程通信的全局数据区域访问。
它来自这里
const指针(即const char* s = ..
)指向无法修改的数据。 易失性指针(即volatile char* s = ...
)提示编译器不要缓存指针在CPU寄存器或其他地方引用的数据。 相反,它们每次需要时都会从原始内存位置重新读取。 如果数据的内容可能在编译器的范围之外发生变化,例如通过修改它的第二个线程,则需要这样做。
注意, const char*
和char* const
是不同的东西,对于volatile
限定符也是如此。 如果您不确定,请查看它们。