字符串小知識(shí)點(diǎn)

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

解釋?zhuān)?/p>

  • 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)存是不可以被改變的。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容