2011-10-12 67 views
7

以下賦值是否有效?或者這些都會造成問題。請建議。常量字符指針賦值

const char * c1; 
const char * c2; 
const char * c3; 
char * c4; 

c2 = c1; 
c2 = c3; 
c2 = c4; 

如果我做了以下事情,那該怎麼辦?

const char * c5 = "xyz"; 
char * c6 = "abc"; 

c2 = c5; 
c2 = c6; 
+0

@ Kshitij Mehta - 不是作業,我們正面臨着我們龐大的代碼庫的記憶問題。所以請任何幫助,將不勝感激。 – user32262

+0

@user你現在已經問了幾次相同的問題。我們一遍又一遍地回答他們。你對這個問題的編輯不加任何東西。它只是重複你上面提到的問題。 –

+1

我很抱歉,如果我問同樣的事情。也許我對指針的理解並不精確。 – user32262

回答

9

所有的聲明都是有效的,因爲所有的指針都沒有被初始化,或者沒有指向任何有效的內存位置。

它們是有效的,因爲指針不是常量,但指針指向的值是常量。所以,這裏的指針可以重新指定爲指向不同的位置。

3

這些作業都是完全有效的,因爲我和其他人在最近一系列幾乎相同的問題中解釋了這些作業。

A const char*是無法使用該指針修改的內存指針。這裏沒有什麼可以繞過這一點。編譯器會反對,如果你指定了c4 = c1,那麼它會繞過const。

30

在你的腦海中畫一條穿過星號的線。左邊是被指向到什麼類型的指針

的例如

  1. const char * const p正確的 - 指針p是恆定的,所以是p指向字符 - 即不能同時改變指針和內容以什麼p指向
  2. const char * p - p指向常量字符。您可以更改p的值,並讓它指向不同的常量字符。但無論p指向什麼,您都無法更改內容。
  3. char * const p - 你是無法改變的指針,但可以改變內容

最後

  1. char * p - 一切都是待價而沽

希望有所幫助。

+0

你的意思是在第一個例子中有2 * s嗎? –

+0

非常清楚。好貼。我只是想知道爲什麼我可以改變一個'const char * ptr'作爲輸入參數,這一點很好地解釋了。我已經退出了另外40分鐘的選票,所以我會在那之後++。 – stevieb

0

所有這些都是有效的,唯一有問題的行是char * c6 = "abc";:這裏「abc」是一個常量字面量,因此將它分配給一個非const指針是不安全的,並且如果不是編譯錯誤,至少應該生成一個警告(我沒有嘗試編譯它)。