直接看例子
#include <iostream>
#include <string>
using namespace std;
int main()
{
char* a = "12345";
char b[] = "12345";
cout << a << endl; //输出12345
cout << b << endl; //输出12345
cout << sizeof(a) << endl; //4,a是一个指针,大小为4
cout << sizeof(b) << endl; //6,输出字符串b的长度,末尾有一个'\0'
//a[0] = '1'; //运行时报错,因为a指向的内容是常量
b[0] = '2'; //修改成功
a = b;
a[0] = '1'; //修改成功,因为a现在指向的是b,是一个字符串数组,不是常量
cout << (void*)a << endl; //输出a,a为char指针,本质上是个地址,
//但是输出char指针会输出其指向的字符串,所以要抓换成其他类型的指针
cout << (void*)b << endl; //同上
cout << &(a[1]) << endl; //输出2345,以为对a[1]取地址之后,本质上又变成了一个char*
cout << &(b[1]) << endl; //同上
cout << (void*)&a[1] << endl;
cout << (void*)(a + 1) << endl; //两种方式都能输出a[1]的地址
const char* c = "12345";
//c[1] = 1; //编译报错,因为c指向的内容是const的
c = b; //但是c不是const的,可以修改指向
char* const d = b;
d[1] = '1'; //修改成功,b是字符串数组,不是常量
//d = a; //编译报错,因为d本身是const的
const char i[] = "12345";
//i[0] = '1'; //编译报错
//i = b; //编译报错
char const j[] = "12345";
//j[0] = '1'; //编译报错
//j = b; //编译报错
//所以i和j两种写法都是同一种类型,没有区别。
return 0;
}