结论
const char*
值不可变,指针可变;
char const*
同上;
char* const
指针不可变,值可变;
注:值不可变指的是不能通过指针修改指向的值,如:
*pa = 'a';
pb[1] = 'a';
但是值本身依然可变,如:
buf[1] = 'h';
原因
const修饰的是它后面的东西,因此三种形式const修饰的分别是
const char* pa
修饰*pa(*pa是值,因此值不可变,指针可变);
char const* pa
同上;
char* const pa
修饰pa(pa是指针,因此指针不可变,值可变);
例子
#include<iostream>
using namespace std;
int main()
{
char buf[] = "ha";
char buf2[] = "ha";
const char* pa = buf;
char const* pb = buf;
char* const pc = buf;
*pc = 'a';
buf[1] = 'h';
pa = buf2;
pb = buf2;
cout << "pa is " << pa << endl;
cout << "pb is " << pb << endl;
cout << "pc is " << pc << endl;
return 0;
}
输出
pa is ha
pb is ha
pc is ah
如果把注释去掉,会发生如下错误:
1>e:\program\test\test\源.cpp(10): error C3892: “pa”: 不能给常量赋值
1>e:\program\test\test\源.cpp(11): error C3892: “pb”: 不能给常量赋值
1>e:\program\test\test\源.cpp(15): error C3892: “pc”: 不能给常量赋值
总结
const char *
与char const*
效果一样,指针指向地址可变,值不可变,即不能通过指针修改对应的值;
char * const
则是不允许修改指针自身,即不能再指向其他地方,但是可以通过指针修改对应的值,即指针为常量;
这三者在实际应用中容易混淆,建议不要使用。