1、常量指针:特点:指针的指向可以修改,但指针指向的值不可以改:如下:
const int* p4 = &x2;
*p4 = 20;//错误,常量指针指向的值不可以改变
p4 = &x1;//正确写法,常量指针的指向可以修改
2、指针常量:特点:指针的指向不可以改,但指针指向的值可以改变;
int* const p5 = &x2;
*p5 = 20;//正确,指针指向的值可以变
p5 = &x1;//错误:指针的指向不可以变
3、const 既修饰指针,又修饰常量:特点:指针的指向和指针指向的值都不可以变
const int* const p6 = &x2;
记忆总结:*p是指针的数值,p是指针的地址。哪个前面加const就哪个不能变
注意:
question:
const char* k = "kjsdfklsjdf";编译不报错,而 char* k= "kjsdfklsjdf";编译报错,为什么
answer:
在C语言中,字符串字面值(例如"kjsdfklsjdf")是一个常量字符数组,存储在只读的数据段。而const char* k声明的变量k是一个指向const char类型的指针变量,其值为字符串字面值的内存地址。这样的声明方式是正确的,因为它允许将常量字符串的地址赋值给指针变量,
但不允许修改指针所指向的内容。而char* k声明的变量k是一个指向char类型的指针变量,其值为字符串字面值的内存地址。此时,编译器会发出警告或报错,因为字符串字面值存储在只读的数据段,而将其地址赋值给非常量指针变量可能会导致对只读内存的修改,这是不允许的。
总之,使用const char* 声明的指针可以指向字符串字面值,而char* 声明的指针在指向字符串字面值时会导致编译器报错或警告。为了避免不必要的问题,建议在指向字符串字面值的指针变量上使用const修饰符。