2013-08-30 33 views
3

我試圖使能夠改變指定的字符數組C++傳遞char數組起作用,並改變它

void change_array(char *target) 
{ 
    target="hi"; 
} 

int main() 
{ 
    char *a[2]; 
    change_array(a[1]); 
    cout<<*(a[1]); 
} 

的內容但隨後一個[1]保持在爲0x0(無效)的含量的函數

+3

有答案告訴你如何通過傳遞所以我會提出「你應該這樣做」的問題。答案是*幾乎可以肯定*「不,你不應該」。你爲什麼使用'char *'s,而不是'std :: string's?如果你沒有立即和迫切需要C字符串,我會建議使用'std :: string's代替。 – anjruu

+0

不,不,我有我自己的理由使用字符串,因爲我正在寫一些像核心戰爭一樣需要逐字閱讀字符數組。 – Echo

+0

你可以使用char **。但我會爲anjruu解決方案使用字符串。 – hetepeperfan

回答

2

將參數傳遞給函數時,通常按值傳遞,這意味着它的值被複制。如果你想改變它,你必須通過引用來傳遞它。這同樣適用於指針,如果你想改變一個指針,那麼你需要通過參考以及通過它:

void change_array(const char*& target) { ... } 
+0

是不是我現在通過引用傳遞? – Echo

+0

@Echo如果你只想通過引用傳遞一個字符,你可以用一個指針來實現,但是你想改變實際的指針,所以你需要通過引用傳遞整個指針。在C++中,你使用「適當的」引用而不是使用指針。 –

3

首先,你的函數傳遞給它的指針的拷貝,所以沒有影響在來電方看到。如果你想修改該函數的參數,傳遞一個參考:

void change_array(char*& target) { ... } 
//     ^

其次,你不能/不應該一個非const指針指向一個字符串綁定。改爲使用const char*

void change_array(const char*& target) { ... } 
//    ^^^^^ ^

int main() 
{ 
    const char* a[2]; 
    change_array(a[1]); 
    cout<<*(a[1]); 
} 
+0

它現在在工作 – Echo

1

你需要把它作爲一個參考:

void change_array(char*&target) 
{ 
    target="hi"; 
} 

否則,你只會改變target本地副本,這不會使功能以外的價值的任何差異。

0

試試這個設計來代替:

std::string get_string() 
{ 
    return "hi"; 
} 

int main() 
{ 
    std::string a[2]; 
    a[1] = get_string(); 
    std::cout<< a[1]; 
} 

要點:

  • 返回由值
  • 使用的std :: string
+0

我的實際目標不是顯示字符串,而是爲了將來的工作真正改變它 – Echo