[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的作用域沒有結束


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM