字符串小知识点

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指向的内存是不可以被改变的。

你可能感兴趣的:(字符串小知识点)