2014-01-27 115 views
2

爲什麼我們不能做到這一點在C:爲什麼我不能把一個數組名字的左邊等號

char name[6]; 
    name = "Jason"; 

然而,我們可以指點。

char name; 
    char * pName = &name; 
    pName = "Jason"; 

數組和指針之間的主要區別是什麼?我知道該數組是一個固定的常量指針,不夠公平,但我不太確定它是如何工作的,如果數組的名稱是指向數組中第一個元素的指針(指針常量),爲什麼不能我用等號改變數組元素的內容?我回答了我的問題,說這是一個指針常量,但我沒有理解這個概念!

+0

如果你想到指針是什麼,那麼你應該認識到'pName =「Jason」;'不會複製任何東西。實際上,如果你有一個類型爲_array-of-char_的成員的結構,並且你使用賦值運算符和這種類型的兩個值,那麼你只需要將pName指向一個字符串即只讀_read-only_ –

回答

1

作爲評估=賦值運算符的結果,C從不復制裸字符串(實際字符數據)。這是因爲這樣的事情在C中不被視爲「價值」。您可以將數組嵌入到結構中,使其成爲值,正如註釋中指出的那樣。

你的第一個例子只有在它有意義時纔有意義,但事實並非如此。第二個例子只是分配一個指針值,這很好。但是你不能重新分配一個數組的地址(在第一個例子中,name是一個常量指針),所以沒有辦法使它工作。

另外,請記住,有更多的數組比字符數組,它是奇怪的,有很多特殊的行爲超載在字符數組的=運算符,在我看來。

+0

...字符串將被複制。所以無論如何,你對結構都有特殊的行爲。 – rodrigo

1

簡而言之,數組名稱實際上是一個指向數組的常量指針。

由於在執行期間無法修改常量對象,因此將數組指定爲左值即賦值運算符的左側是無效的。

要使用你的榜樣,下面是試圖以一個數組名稱分配一些等價的:

char name; 
const char *pName = &name; 
pName = "Jason"; //error!! 

結帳memcpy()strcpy()來修改陣列的內容。注意確保寫入的數組不是常量(或靜態分配)。

2

因爲當你寫"a constant string",編譯器分配該字符串中的編譯代碼,如果你做c = "a string"其中c是一個指針,c將立即指向該特定位置。

數組的位置反而是固定的(你不能說「現在指向別的東西」),所以你應該複製字符串strcpy

strcpy(name, "Jason"); 

以這種方式,編譯器將在編譯的代碼分配"Jason",但在執行時它的內容將在專用於name的存儲器區域被複制。

+1

從這個邏輯我知道編譯器執行每個語句在RAM中的某個地址,因爲該數組是一個指針常量:意味着位置不能改變,這就是爲什麼我不能在這裏使用等號,因爲它會改變固定的地址。 – user3103230

相關問題