美文网首页
字符串小知识点

字符串小知识点

作者: AwesomeAshe | 来源:发表于2016-04-08 21:19 被阅读38次

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

    相关文章

      网友评论

          本文标题:字符串小知识点

          本文链接:https://www.haomeiwen.com/subject/htwvlttx.html