我需要使用函式更改 std::string 的值。
該函式必須為 void,并且引數必須是指向字串的指標,如圖所示。
#include <iostream>
void changeToBanana(std::string *s) {
std::string strGet = "banana";
std::string strVal = strGet;
s = &strVal;
}
int main() {
std::cout << "Hello, World!" << std::endl;
std::string strInit = "apple";
std::string* strPtr;
strPtr = &strInit;
changeToBanana(strPtr);
std::cout << *strPtr << std::endl;
return 0;
}
我希望列印結果顯示“香蕉”其他答案涉及更改引數。
我嘗試使用 for 回圈分配字串,并逐個元素地進行,但這不起作用。值保持不變。
uj5u.com熱心網友回復:
該函式必須為 void,并且引數必須是指向字串的指標,如圖所示。
有了這個要求,您就不能更改傳遞給函式的指標的值,因為它是按值傳遞的。
不要將指標與其指向的內容混淆。引數按值傳遞(除非您通過參考傳遞它們)。制作了一個副本,并且您在函式中所做的任何更改s都不適用于main.
但是,您可以更改指標指向的字串(因為s指向與 中的指標相同的字串main):
void changeToBanana(std::string *s) {
std::string str = "banana";
*s = str;
}
但是,這不是慣用的 C 。您應該傳遞void changeToBanana(std::string& s)一個參考或回傳字串std::string returnBanana()。
uj5u.com熱心網友回復:
void changeToBanana(std::string *s) {
std::string strGet = "banana";
std::string strVal = strGet;
// the following line doesn't do anything
// useful, explanation below
s = &strVal;
}
s = &strVal分配strValto的地址s。然后函式結束并且對的任何修改s都被“忘記”,s因為它是一個區域變數changeToBanana。
所以呼叫changeToBanana(&foo)什么都不做。
你要么想要這個:
void changeToBanana(std::string *s) {
*s = "banana";
}
...
std::string strInit = "apple";
changeToBanana(&strInit);
或者這個(首選,因為你不需要指標):
void changeToBanana(std::string & s) {
s = "banana";
}
...
std::string strInit = "apple";
changeToBanana(strInit);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/454250.html
上一篇:指標陣列對所有元素保持相同的值
