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";
运行结果:
解释:
- s1,s2是字符数组,由于是数组,所以会申请一块新的内存然后把值放进去;
- s3,s4是指向字符串的指针,指向的是同一块内存。
而这两者的访问属性也是不一样的:
s1[0] = 'd'; std::cout << s1;
可以成功运行;
但是如果这样的话,编译可以通过,运行崩溃:
s3[0] = 'd'; std::cout << s3;
也就是说s3指向的内存是不可以被改变的。