2012-02-26 127 views
0

畢竟,我必須聲明我是一個初學C++和編程的整體。 我會直指點。我想知道是否可以將任何大小的字符串分配給指向字符的指針(不是數組,只是一個char *指針)。這會違反任何內存地址嗎? 我正在學習的這本書似乎沒有提到這方面的任何內容。我似乎無法在Google上找到任何內容。將任意大小的字符串賦給指向字符的指針

+0

'爲const char * PTR =「任何大小的字符串」;'是有效的。除非您佔用字符串文字的整個只讀位置。 – Mahesh 2012-02-26 04:58:38

+0

你的意思是如果字符串太長會發生錯誤?這就是說,如果指針指向只讀內存位置,是嗎? – T0rm3nt0R 2012-02-26 05:02:44

+1

「違反內存地址」是什麼意思? – 2012-02-26 05:13:29

回答

1

A char指針可以指向任意長度的字符串,因爲字符串的長度由您在字符串中遇到NUL(0)字節時確定。當你以這種方式存儲字符串時,它會變成一個C字符串。例如:

const char* str = NULL; // at this point, 
         // doesn't point to anything (not even a string) 

str = ""; // valid 
str = "a"; // valid 
str = "hello"; // valid 
str = "farewell, cruel world"; // valid 
+0

不會有點長的字符串會覆蓋某些只讀內存位置嗎? – T0rm3nt0R 2012-02-26 05:04:30

+0

我想到的另一個問題是爲什麼動態內存操作符會使用new和delete來確定指針變量將佔用的大小?似乎可以使他們的指針完全像他們想要的那樣大,而不必使用動態內存。 我正在學習的這本書使用新的和刪除來指示只是他們需要的大小,根據我能夠理解的內容,這看起來很奇怪。 – T0rm3nt0R 2012-02-26 05:06:33

+0

@ T0rm3nt0R,Seth示例中的所有字符串都可能位於只讀內存中,如果這就是您要求的內容。如果一個字符串來自用戶輸入,那麼動態地爲字符串分配空間可能非常有用。 – 2012-02-26 05:14:16

2

你有你的字符指針,並要動態地創建C字符串

char *str; 

說。這個指針將被用來指向字符串的第一個字符。該字符串是內存中的一系列連續字符(字節)。我們怎樣在內存中實現這​​一點:

str -> +---+---+---+---+---+----+ 
     | H | E | L | L | O | \0 | 
     +---+---+---+---+---+----+ 

注意最後一個字節 - 這個字節的值是0,是調用空字符 - 它代表字符串的結尾,使一個easilty知道,當我們有走到最後。

str一個值ne分配這個內存。在C++中,這通過0​​這樣

str = new char[6]; 

注新做有兩個版本新[]和新 - 一個是分配對象的陣列,另一種是分配一個單獨的對象。當你使用new []分配它時,總是使用delete [],同樣應該使用new/delete。不要混合刪除新[],刪除[]

這將分配一個由6個字符組成的數組來放置字符串。爲了將字符放入字符串中,我們冷做到這一點。

str[0] = `H`; 
str[1] = `E]; 
... 
str[5] = 0; 

但是,這將是單調乏味的。相反,我們可以使用strcpy爲我們做到這一點:

strcpy(str, "hello"); 

它知道所有有關的空字符。在這些類型的字符串上有一系列的功能 - 請參閱string

這是C字符串。曾幾何時,有人發明了這種稱爲C++的新語言。這種語言使用了一種叫做對象的不同想法,這使得這件事更容易。您需要查看標準模板庫(或STL)。關於這些字符串的注意事項可在string找到。有很多在STL的好東西 - 這裏是一個參考STL

希望這有助於

+0

非常感謝您的詳細解釋。 你能解釋一下爲什麼要爲用戶輸入字符串動態分配內存而不是僅僅使用指針。我很困惑爲什麼爲用戶輸入數據使用動態內存分配而不是字符串是有用的。 – T0rm3nt0R 2012-02-26 05:53:48

+0

你使用C++或C(如上所述)字符串嗎? – 2012-02-26 06:06:21

+0

我從來沒有使用過C,但如果它有幫助,我正在討論在C++中使用新的和刪除操作符來分配內存。 – T0rm3nt0R 2012-02-26 06:09:15