1、内存分配
const char* str="abc";
这个变量一共消耗了8个字节,其中变量str占用了四个字节,"abc"这个常量字符串占用了
4(\0)个字节,其中str占用的四个字节是在栈中分配的,"abc"常量字符串通常在全局堆中分配。
const char str[]= "abc";
这个变量只消耗了4个字节,这三个字节就用来存放字符串“abc”,str实际上只是定义了
一个编译的符号常量而已,这个符号常量的值就是字符串"abc"的偏移。
2、编译时的差别:
const char* str="abc";
如果对str进行访问,例如printf("%s",str);系统访问内存的过程时将变量str取出(四个字节),将这四个字节的内容作为指针,间接的访问到"abc"所在的位置。
例如str的被编译后的地址是0xXXXXXXXX,则代码大概是:
movax,[0xXXXXXXXX]
pushax
const char str[]= "abc";
在这个时候对str进行访问的话,例如:printf("%s",str),在编译完毕的时候,参数入栈的时
候就已经时立即数了。例如str的地址是0xXXXXXXXX,编译后的代码直接就是:
push0xXXXXXXXX
const char *b = "abc"; //如果要改写 b 所指,编译期出错
char *b = "abc"; //如果要改写 b 所指,运行期出错