const char * arr = "123";
// 可以修改指向: arr = "321";
// 不可以修改值: arr[0]='2' //------error
字符串123保存在常量区,const本来是修饰arr指向的值不能通过arr去修改,但是字符串“123”在常量区,本来就不能改变,所以加不加const效果都一样const char *p;
(指向常量的指针,上同)
先看p,根据优先级它和*结合,是指针,指向char类型,但是char前面有一个const修饰,所以p所指向的内容为const类型不可修改。
int num_a = 1;
int const *p_a = &num_a; //底层const
//*p_a = 2; //错误,指向“常量”的指针不能改变所指的对象
注意:指向“常量”的指针不代表它所指向的内容一定是常量,只是代表不能通过解引用符(操作符*)来改变它所指向的内容。上例中指针p_a指向的内容就不是常量,可以通过赋值语句:num_a=2; 来改变它所指向的内容。
char * brr = "123";
字符串123保存在常量区,这个arr指针指向的是同一个位置,同样不能通过brr去修改"123"的值
const char crr[] = "123";
这里123本来是在栈上的,但是编译器可能会做某些优化,将其放到常量区
char drr[] = "123";
字符串123保存在栈区,可以通过drr去修改
char const *p;
由于没有const *的运算,若出现const *的形式,则const实际上是修饰前面的,所以char const *p和const char *p一样
char * const p;
(指针常量)
const修饰的是p,p不能修改,p所指向的内容可以修改
int num_b = 2;
int *const p_b = &num_b; //顶层const
//p_b = &num_a; //错误,常量指针不能改变存储的地址值
举例:
int c = 3; int a = 2; int b = 1 ; //const出现在*左边,则被指物是常量 const int * pi = &a; *pi = b;//不正确 被指物是常量 pi = &c; //正确 //const 出现在* 右边,则指针是常量 int * const p = &a; p = &c;//不正确,指针是常量 *p = c;//正确 //const出现在*左右两边,则被指物和指针都是常量 const int * const ptr = &a; ptr = &c;//不正确,指针是常量 *ptr = c;//不正确,被指物是常量