1.既有char* 何有 char[]?
一直以来我对此一无所知,我也一直在想这同一件事的两种写法有何意义,其中的奥妙容我慢慢道来。
2.char* 无法做到的事情
char* p; // 这条语句声明了一个指向char类型的指针p,请注意,它没有为*p 开辟空间,甚至*p在哪儿都是个问题
char p[100]; // 这条语句声明了一个指向char类型的指针p,同时,它为*p开辟了100个字符的空间
3.仅仅如此吗?
有意思的在后面
// 这种写法是古老的,被淘汰的写法,现代编译器只是为了
//兼容以前的错误代码才允许运行的一种写法,因为"abc" 是一个常量,储存在文字常量区
//也就是 const char* ,而const char *是无法转变为 char* 的。这里强制转换的结果就是
//*p指向的量是无法修改的。
char* p = "abc";
// 上面那句的正确写法应该是这样
const char*p = "abc";
// 那么这种写法也不对吗?,非也,这时的"abc"不是常量,这里编译器把该语句解析为
// char p[4] = {'a','b','c','\0'};所以这里的"abc"是储存在栈区的。
char p[] = "abc";
//那么以此推理,这种写法中 p 也是储存在栈区的。其本质是和字符数组char[] 一样。
string p = "abc";