指针常量和常量指针是两个很容易混淆的概念,在此加以区分。
1)概念
char* const p1; //指针常量
const char* p2; //常量指针
可以这样方便记忆两个概念,按照次序读,char*const ——(指针常量);constchar*—— (常量指针)。
2)理解
具体来看,指的是const之后的东西不能变,因而,char* const p1;——p1不能改变,也就是p1只能在初始化是指向一个特定地址,之后就不能修改,也即p1的值只能初始化一次。而const char* p2; 则是说*p2的值不能变,也就是p2指向空间的值不能改变。
3)看一个例子
#include
using namespace std;
void main()
{
char* const p1 = "abc"; //指针常量
const char* p2 = "bcd"; //常量指针
p1 = "kkk"; //编译无法通过,不能修改p1的值
p2 = "kkk"; //编译可以通过,可以运行,可以修改p2的值,不能修改*p2的值
*p1 = 'c'; //编译可以通过但是不能运行
*p2 = 'a'; //编译无法通过,无法修改p2指向空间的值
}
在此需要特别说明一下*p1=‘c’可以编译通过,但是无法运行的原因: 先不要纠结const char* 与char* const的问题,一个变量前面有再多修饰符都只是在修饰变量。 一个普通的字符串编译器按照常量处理,这个常量字符数组放在内存中的只读区域(也就是代码段),通过p1或p2指针向只读存储区写数据会引起Segment Fault,无法运行。
而如果这样 ,则是可以的。
char a[]="nice day";
char* const p=a;
a[1]='w';
*pc = 'k';
cout<