const char*, char * const, char [], const char[]等对比

mac2024-05-06  29

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;//不正确,被指物是常量

 

最新回复(0)