关键点:const 属于修饰符 ,修饰常量,const 修饰的位置很关键。
const修饰指针和修饰变量存在差异
修饰变量
const是常量修饰关键字,被它修饰的**变量**在定义时赋值,之后不能对这个变量赋值,如果强制进行赋值会产生出错处理,
int const a;与const int a; //无差别
const int a[5]={1,2,3,4,5};
a[0]=3;/*出错,对数组a[]中任意一个再次赋值都会出错*/
int a[5] //除了定义时赋值,再次对数组a[]中任何一个元素都可以赋值。
a[0]=3; //ok
修饰指针
1、const int *a
这里const 修饰的是int,而int定义的是一个整值
因此*a 所指向的对象 值 不能通过 *a 来修改,但是 可以重新给 a 赋值,使其指向不同的对象。
eg:
const int *a = 0;
const int b = 1;
int c = 1;
a = &b // 额外:注意不能通过a 来修改 b值
a = &c // 额外:虽然c本身不是一个常量
*a = 2 //error 为题就在这里,不能修改通过 *a 所指向的对象值,最后赋值得对象是c,因此不能通过*a 来修改c值。
2、int *const a
这里const修饰的是 a ,a代表的是一个指针地址
因此不能赋给a其他的地址值,但可以修改a指向的值
这有点和cont int *a相反的意味,例子就不说了
3、补充:
1、int const *a 和 const int *a 的意义相同、作用等价;
4、 const int *const a
a所指向的对象及对象的值均不可改变;
5、总结
5.1、const 对象的地址只能赋值给指向const 对象的指针;
5.2、指向const 对象的指针可以 被赋 以 一个非const 对象的地址 ;
5.3、指向const 的指针常被用作函数的形参,保证被传递给函数的实际对象在函数得实际对象在函数中不会被修改;
5.4、常量在定义后就不能被修改,所以它必须被初始化。未初始化的常量定义将导致编译错误(上面都是在说明const的问题,所以没有赋值,实际语句中要赋值的)