char * ch跟char mch[]的区别

char * ch和char mch[]的区别
在论坛里看到这个问题
C/C++ code
void main()
{
    int i;
    char * ch = "cchars"; //这是C风格字符串,结尾有'\0'
    char mch[] = "mchars";   
    ch[0] = 'd'; //error,char *ch获取的内存是const,相当于const char *ch= "cchars";无法修改.
    mch[0] = 'f'; //ok      
}

请问为什么char *ch获取的内存是const,而char mch[]却不是呢?char * ch和char mch[]经过编译器大概转换成了怎么样的代码?

------解决方案--------------------
“char * ch和char mch[]经过编译器大概转换成了怎么样的代码?”

你可以自己看一下编译器编译出来的汇编代码
简单地说,char * ch将四字节入栈,这四字节是char *的大小,直到这个变量生存期结束为止,这四字节就是ch这个变量,赋值 = "cchars",即在常量区放置这个字符串,然后将这个字符串的首字符地址放到这四字节里
char []首先判断数组大小,在这种定义方式下,数组大小自动取赋值的字符串长度加一,结果为7,然后将这7字节(内存对齐的结果是8字节)入栈,再将放置在常量区的这个字符串内的六个字符加结束符共七个字符复制到这八字节内
------解决方案--------------------
char * ch = "cchars"; "cchars"在常量区 是不能更改的 叫const的吧 ch只是一个指针变量 指向这个常量字符串 这个字符串的地址和内容在编译的时候已经确定了 。
char mch[] 在栈上开辟了内存 内容是可以更改的 地址是程序运行时候确定的