1熊痴,兩種申請(qǐng)字符串的區(qū)別:
我們經(jīng)常會(huì)用這兩種方式去申請(qǐng)字符串/字符數(shù)組:
char s1[] = "abc";
char *s3 = "abc";
然而這兩者是有區(qū)別的:
- 在c/c++里面他爸,為了節(jié)省空間,虛擬內(nèi)存里面會(huì)有一塊區(qū)域是存放字符串常量的果善。
當(dāng)幾個(gè)指針賦值給相同的字符串時(shí)诊笤,指針會(huì)指向同一塊內(nèi)存;
但是用常量?jī)?nèi)存初始化數(shù)組的時(shí)候巾陕,情況卻不是這樣:
我們運(yùn)行如下的測(cè)試代碼:
char s1[] = "abc";
char s2[] = "abc";
char *s3 = "abc";
char *s4 = "abc";
if (s1 == s2)
std::cout << "s1=s2" << "\n";
else std::cout << "s1!=s2"<<" : s1="<<&s1<<" ,s2="<<&s2 << "\n";
if (s3 == s4)
std::cout << "s3=s4" <<" ="<<&s3<< "\n";
else std::cout << "s3!=s4" << "\n";
運(yùn)行結(jié)果:
code-1
解釋:
- s1讨跟,s2是字符數(shù)組,由于是數(shù)組鄙煤,所以會(huì)申請(qǐng)一塊新的內(nèi)存然后把值放進(jìn)去许赃;
- s3,s4是指向字符串的指針馆类,指向的是同一塊內(nèi)存。
而這兩者的訪問(wèn)屬性也是不一樣的:
s1[0] = 'd'; std::cout << s1;
可以成功運(yùn)行弹谁;
但是如果這樣的話乾巧,編譯可以通過(guò),運(yùn)行崩潰:
s3[0] = 'd'; std::cout << s3;
也就是說(shuō)s3指向的內(nèi)存是不可以被改變的预愤。