字符串小知識點

1,兩種申請字符串的區(qū)別:
我們經(jīng)常會用這兩種方式去申請字符串/字符數(shù)組:

char s1[] = "abc";
char *s3 = "abc";

然而這兩者是有區(qū)別的:

  • 在c/c++里面,為了節(jié)省空間,虛擬內(nèi)存里面會有一塊區(qū)域是存放字符串常量的。
    當幾個指針賦值給相同的字符串時,指針會指向同一塊內(nèi)存;
    但是用常量內(nèi)存初始化數(shù)組的時候,情況卻不是這樣:

我們運行如下的測試代碼:

    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";

運行結(jié)果:


code-1

解釋:

  • s1,s2是字符數(shù)組,由于是數(shù)組,所以會申請一塊新的內(nèi)存然后把值放進去;
  • s3,s4是指向字符串的指針,指向的是同一塊內(nèi)存。

而這兩者的訪問屬性也是不一樣的:
s1[0] = 'd'; std::cout << s1;
可以成功運行;

但是如果這樣的話,編譯可以通過,運行崩潰:
s3[0] = 'd'; std::cout << s3;
也就是說s3指向的內(nèi)存是不可以被改變的。

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

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