• [C++] 函数中的字符串指针与数组


    函数中的数组

    1. 

    char* getMem()
    {
        char p[] = "Hello world";
        p[5] = 0x0;
        return p;
    }

    p是一个数组,是一个局部变量,说明这个函数执行完毕之后p数组中的值都被销毁了

    如果单独使用p,则p表示这块数组的首地址。函数返回值按值传递是p,仅仅传递p的地址,而p数组中的内容都被销毁了。

    2. 

    char* getMem()
    {
        char* p = "hello world";
        p[5] = 0x0;
        return p;
    }

    常量区的字符不能修改。

    3. 

    char* getMem()
    {
        char* p = "hello world";
        return p;
    }

    正确,helloworld存在于常量区。不会随着函数结束而销毁

    4. 

    string& getMem()
    {
        string s = "hello world";
        string& rs = s;
        return rs;
    }

    string ss = getMem(); 错误。因为s是局部变量,返回值是一个引用,本质上在临时区建立了一个引用,这个临时的引用引用了rs,也就是s。但是函数结束后s被销毁。但是引用不能为空。所以错误

    string& rs = getMem(); 错误,因为rs是s的引用,s已经销毁,rs返回一个乱码值。表达式成立是因为返回值是一个引用,引用是一个左值,可以通过左值引用来引用。

    5. 

    string getMem()
    {
        string s = "Hello world";
        string& rs = s;
        return rs;
    }

    string ss = getMem(); 正确,值传递ss是一个新的局部变量,完全拷贝了getMem的返回值

    string& ss = getMem(); 错误,getMem返回值是一个临时变量,也就是右值,不能用左值引用来引用

    const string& crs = getMem(); 正确,右值可以使用const引用来引用

    6. 

    string getMem(string& s)
    {
        string& rs = s;
        return rs;
    }

    string s = "hello world";

    string ss = getMem(s); 正确

    string& rs = getMem(s); 错误,

    const string& rs = getMem(s); 正确

    7. 

    string& getMem(string& s)
    {
        string& rs = s;
        return rs;
    }

    string s = "hello world";

    string ss = getMem(s); 正确,用外面的s初始化ss

    string& rs = getMem(s); 正确,rs指向s,s的作用域没有结束

  • 相关阅读:
    CDQ分治·学习笔记
    高斯消元板子
    [HEOI2012]朋友圈
    [CTSC2008]祭祀
    Medium | LeetCode 140. 单词拆分 II | 回溯(递归)
    Hard | LeetCode 212. 单词搜索 II | 回溯 + 前缀树
    Medium | LeetCode 131. 分割回文串 | 回溯 + 动态规划预处理
    Hard | LeetCode 329. 矩阵中的最长递增路径 | 矩阵+DFS
    Hard | LeetCode 76. 最小覆盖子串 | 滑动窗口
    Medium | LeetCode 130. 被围绕的区域 | 矩阵 + DFS
  • 原文地址:https://www.cnblogs.com/immjc/p/9149678.html
Copyright © 2020-2023  润新知