2012-04-05 119 views
0

在C++中以下是有效C++陣列VS指針

int *p = new int[3]; 
    *p=0; 
    *(++p)=1; 

另外以下是有效

int j[] = { 0, 1, 2}; 
    *j = 3; 

鑑於,* J = 3部作品,爲什麼以下無效

*(++j)=4;//invalid.. lvalue required as increment operand 
+2

'j'是常數指針,用於啓動數組 – turbanoff 2012-04-05 05:14:57

+3

@turbanoff:否,'j'是一個數組類型,不是指針類型。 – dreamlax 2012-04-05 05:29:00

+2

注意'*(j + 1)'沒問題,因爲你並不是試圖修改'j'本身。 – 2012-04-05 05:31:31

回答

0

陣列和指針是相似的,但這是一個地方,他們不是。

如果要遍歷一個數組,使用一個單獨的指針變量:

int j[] = { 0, 1, 2};  
int* jp = j; 

jp然後指向的j第一個元素。然後:

*(++jp) = 4; 

將工作。

2

在表達這樣

*(++j)=4;//invalid.. lvalue required as increment operand 

j這是一個數組INT [3]「衰變」的指針數組的第一個元素。該指針是一個右值,並且不能分配,因此您不能執行諸如*(++j)之類的操作。

在其他範例p是一個指針,它是非常量和可分配:

int *p = new int[3]; 
*p=0; 
*(++p)=1; 

你的右值獲得的行爲類似於將一個常量指針發生什麼:

int const *p = new int[3]; 
*p=0; 
*(++p)=1; 
+0

我認爲你和低調的答案一樣犯了同樣的錯誤。 'j'是一個數組,你不能增加數組。 – 2012-04-05 06:34:18

+0

'j'衰減到一個指針,但它不像'const'那樣是常量,它只是一個_rvalue_。非類型的_rvalues_永遠不是'const'。 – 2012-04-05 06:35:39

+0

@Charles Bailey:好的,我糾正了。這是更好嗎? – 2012-04-05 07:01:31