1,兩種申請字符串的區別:
我們經常會用這兩種方式去申請字符串/字符數組:
char s1[] = "abc";
char *s3 = "abc";
然而這兩者是有區別的:
- 在c/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";
運行結果:
code-1
解釋:
- s1,s2是字符數組,由于是數組,所以會申請一塊新的內存然后把值放進去;
- s3,s4是指向字符串的指針,指向的是同一塊內存。
而這兩者的訪問屬性也是不一樣的:
s1[0] = 'd'; std::cout << s1;
可以成功運行;
但是如果這樣的話,編譯可以通過,運行崩潰:
s3[0] = 'd'; std::cout << s3;
也就是說s3指向的內存是不可以被改變的。