先来看三组代码:
1.const char *name1 = "Levitt";//正确
2.char *name2 = "Levitt";//报错
3.char name3[] ="Levitt";//正确
对于这种现象,我百思不得其解,后来请教了我们班的著名大佬老陈。最后得出了结论(当然也有可能结论有错,望广大网友指正)
① 为什么1正确而2报错,这是因为1这行代码的等号右边,也就是"Levitt"这行字符串,是存储在静态区的。
静态区存储的是常量,如果把"levitt"看作是一个整体,那它本身也是字符串的名称,字符串就是字符数组,数组的名称即指向这个数组的地址(同时也是这个数组第一个元素的地址,第一个元素是char型,所以用char*没错)。因此1行代码的操作也就是把静态区"levitt"这行字符串的地址赋值给了指针name1,前面提到"Levitt"是存储在静态区的,自然不可改变,那么指向"Levitt"的指针自然也必须是const型,结合起来,就是const char*。
② 为什么3正确,因为3此时并不是取地址操作了,而是相当于一个拷贝的操作,把静态区的"Levitt"拷贝了一份到栈区,取名叫name3(同时name3也是它的地址),所以此时"levitt"这行字符串会存在栈区之中,但是静态区的"Levitt"会不会被释放掉呢?我目前还不知道。
另外还有一点,如果在最开始声明字符数组时没有初始化,后面就只能一个一个的赋值了,或者用strcpy函数。例如char name[50] ; *name="Levitt";//报错