const这块的难点
const修饰指针有以下的几种形式 ,不同的形式 它的意义不一样。
形式1:
int a=23;
const int *p=&a; a是int型,&a是int *型的,要把int *型的赋给 const int *型的。涉及到了点类型转换。
问 const int *p=&a;这个操作,导致了谁不能被操纵了?!
这里修饰的是 *p,所以 *p 如果重新赋值是不可以的!!
*p不能变,但是p是可以变的。
第二种:
int const * p 这种情况和 const int *p 是一模一样的,都是修饰 *p。
第三种:
int * const p;结果是 *p可以变,p不能变。
还是比较容易理解的:
就看const修饰的是谁,const如果在*p的前面,修饰的就是*p,*p就是常量了,就不能变(也就是不能通过*p重新赋值)。
const如果放在* 和 p中间了, * const p,修饰的就是p,p就是常量了,就不能重新赋值了。
第四种:
如果既想让*p不能变,又想让 p不能变,如何写??!!
让他俩都被修饰——const int * const p(第一个const修饰了*p,第二个const修饰了p),这时,*p不能变,p也不能变。
volatile (是对存储位置的优化)
restrict(对代码量的优化)