[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的作用域没有结束
原文链接: https://www.cnblogs.com/immjc/p/9149678.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/275470

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月15日 上午1:02
下一篇 2023年2月15日 上午1:03

相关推荐