1. 程式人生 > >[C++] 函數中的字符串指針與數組

[C++] 函數中的字符串指針與數組

不能 臨時變量 char c++ 銷毀 初始 表達式 const crs

函數中的數組

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

[C++] 函數中的字符串指針與數組