const和volatile指针之间有什么区别?
解决方法
差异真的归结于const和volatile之间的差异.这两个概念的唯一共同点是语法. const是编译器执行的,并且说“程序员不能改变这个”. 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 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