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