【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*