字符串字面量声明定义赋值给指针与数组的差异分析

字符串字面量声明定义赋值给指针与数组的差异

字符串字面面量不能被修改,这是铁理!那么问题来了?为什么

char *p="abc";

*p='d';//(wrong!)

char p2[]="abc";

p2[0]='d';//(right!)

这是为毛?为毛啊?不是说好的常量不能被修改吗?char *p="abc"是常量?没有const啊!那为什么p2[0]='d'正确 ,*p='d'错误?

且听我娓娓道来,首先需要知道一点,“abc”属于字符串字面量(字符串常量),“字符串字面量不允许被修改”存储在常量存储区,无法被修改。

①char *p="abc"指针变量p指向字符串”abc”的第一个字符,即p等于”abc”字符串中’a’的地址,当*p='d',即要将地址为p存储的值由原来的’a’修改为’d’,如此”abc”便会变成”dbc”,由于“字符串字面量不允许被修改”,因此编译器会判定*p='d'为wrong。

 

②而char p2[]="abc"由于字符串变量的声明可以省略它的长度,在这种情况下编译器会自动计算长度,编译器会为p2分配4个字符的空间,这足够存储“abc”的字符和一个空字符。看清楚了!编译器会为p2分配4个字符的空间!,这个时候就产生了两个地址块(次说话自己造的),一个地址块是存储字符串字面量“abc”的连续地址(在常量存储区中),另一个是编译器会为p2分配4个字符的空间(栈区)。接下来用图来表示。

如图所示,char p2[]="abc"是通过类似于值传递的过程,将’a’,’b’,’c’,’\0’四个字符传递到编译器会在栈区为p2分配4个字符的连续地址空间中,如此由于栈区数据可读可写,即可以修改,p2[0]='d';即编译器允许将栈区的’a’修改’d’。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

猜你喜欢

转载自blog.csdn.net/qq_29250265/article/details/94546172