2012-04-05 88 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