1. 程式人生 > >【C++】char*如何修改

【C++】char*如何修改

char*修改不了,但是可以用[]來申明字串,這樣字串就能被修改了。
但操蛋的是,[]不能被賦值,char*可以被賦值。
void change(char *source){

    source[0] = 'D';

    cout<<source<<endl;
}

考慮一下,你有這麼一個函式change它的作用是將傳過來的字串的第一個字元改成H,然後將這個字串打印出來

誰知道這個函式為什麼要這樣呢?說不定編寫這個函式的程式設計師的名字的第一個字母是D也說不定

 

好了,現在我們可以使用這個函數了

char a[] = "Peter";
change(a);

我們建立了一個字串陣列,它的內容是Peter,我們呼叫了change把Petter中的P改成了D,poor letter P,一切正常,我們得到了一個Deter。

 

現在有人使用瞭如下的程式碼呼叫change

char *a= "Petter";
change(a);

或者你覺得建立一個變數太麻煩了,於是你直接傳遞了一個字串過去

change("Peter");

然後可怕的事情發生了,你的程式產生了異常,崩潰掉了,編譯器會告訴你寫入位置 xxx 時發生訪問衝突或者類似的錯誤原因,於是開始抱怨change函式編寫者,他編寫的函式怎麼會讓你的程式崩潰了。

無辜的change編寫者,在承受著你的埋怨,因為事實的真相卻是你向change函式傳遞了一個無法被更改的字串

 

好吧,讓我們看下下面的程式碼

char *a = "Peter";
char b[] = "Peter";
char *c = new char[6];
strcpy_s(c, 6, "Peter");

a,b,c三個指標所指的內容都是peter,但這三個peter卻位於不同的地方

a所指的Peter位於常量區

b所指的位於棧上

c所指的位於堆上

 

所以任何對a對source所指的內容的修改都會出現錯誤,但你可以讓a指向一個新的地方,因為a是一個指標,如

a=b;

但對於位於棧上的b來說,你可以修改b所指的內容,卻不能修改b

b=a;// error 不能修改b

我的理解:b被初始化過,長度為6,如果這時將一個char*賦值給b,那麼是不能確定b能否容納char*所有的字串的,萬一長度比6大,那該怎麼辦呢?所以C++直接杜絕了這種情況。

 

好了,讓我們回過頭來之前出錯的那段程式碼

char *a= "Petter";
change(a);
change("Peter");

source所指的內容都是位於常量區的

所以任何對source所指的內容的修改都會出現錯誤

 

Remember

不要將一個字串直接傳遞給一個函式或者賦值給一個char*型別的指標,除非你知道這個字串中的字元的內容不會被改變

如何你可能會修改這個字串的值,請使用char[],如果想使用字串不變數,請使用const char*