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";
最后修改:2019 年 11 月 15 日
如果觉得我的文章对你有用,请随意赞赏