请看具体示例
#include<iostream>
using namespace std;
void main(void)
{
// char* a 与 char a[] 的区别
char* a = "abcdef"; // a为一指针,其值可以改变。现在a指向的是一常量字符串
cout << a << endl;
a = "ghijkl"; // a现在指向另一常量字符串
//a[0] = 'z'; // a指向的为常量,编译没问题,但运行出现异常
cout << a << endl;
cout << sizeof(a) << endl; // 4
char b[] = "abcdef"; // b为数组首地址,为一常量,其值不可改变。所指内容不是常量字符串
cout << b << endl;
//b = "ghijkl"; // 编译无法通过,b为常量,无法为其指定其它值
b[0] = 'z';
cout << b << endl;
cout << sizeof(b) << endl; // 7
// ------------------------------------------------------------------------------
// const char* a 与 char* const a 区别
char c[] = "abcd";
char d[] = "efgh";
const char* pC = c;
//pC[0] = 'z'; // 编译出错,pC为指向常量的指针,做不能修改指针指向的内容
cout << pC << endl;
pC = d;
cout << pC << endl; // pC指向的内容不能改,但可以修改指向
char e[] = "abcd";
char f[] = "efgh";
char* const pE = e;
//pE = f; // pE为常量指针,不能改变其指向
pE[0] = 'z'; // pE为常量指针,虽然不能改变其指向,但可以修改指向内容
cout << pE << endl;
}
// 总结:(1) char* a这种形式:a为指针,可以改变其指向,
// 其所指向的字符串为常量,不能修改其指向的内容。
// (2) char a[]这种形式,a为数组名,为常量,不能再
// 指向其它字符串,但其指向的内容不是常量字符串,
// 故可以改变。
// (1) const char* a 为指向常量的指针,所指内容为常量,
// 不能修改,但可以改变其指向,这种形式还与
// char const * a等价。
// (2) char* const a 为指针常量,不能改变其指向,但可
// 以修改其指向的内容。
// (3) const char* const a 为指向常量的常指针,即不能
// 改变其指向,也不能改变其指向的内容