为什么不能将*指针+偏移量用作l值? (“错误:赋值中的非左值”)

时间:2012-11-24 19:48:45

标签: c++ arrays pointers syntax

这是我的代码:

void doubleValuesInArray(int *pointer) {
    for (int n = 0; n < 2; n++) {
        int a = (*pointer+n);
        a = a * 2;
        *pointer+n = a;
    }
}

int main(int argc, char** argv) {
    int myArray[] = {1,2};
    doubleValuesInArray(myArray);
    cout<<myArray[0]<<endl;
    return 0;
}

输出是:

main.cpp:在函数`void doubleValuesInArray(int *)'中: main.cpp:19:错误:赋值中的非左值 make [2]: * [build / Debug / Cygwin-Windows / main.o]错误1 make [1]: [.build-conf]错误2 make:* * [.build-impl]错误2

我的问题是:

int a = (*pointer+n);

工作得很好。变量'a'通过使用* pointer + n从数组中获取值0和1。

然而

 *pointer+n = a; 

似乎不起作用。

如果我使用     pointer [n] = a; 它也有效。

为什么我的第一种方法不起作用?

3 个答案:

答案 0 :(得分:4)

您没有正确地将指针表达式括起来:*具有更高的优先级,因此您应该在添加中添加括号:

int a = *(pointer+n);
a = a * 2;
*(pointer+n) = a;

答案 1 :(得分:3)

很明显 - *pointer+n是一个r值 - 这意味着你无法分配它。

你的意思是

*(pointer+n) = a;

因为两者不同。 *pointer+n只返回数组的第一个元素并向其添加n(结果是r值)。 *(pointer+n)是第n个元素(l值)。

答案 2 :(得分:3)

你正在做的事情是完全错误的。解除引用运算符*的优先级(优先级)高于+,因此*pointer + nn添加到值pointer指向。校正:

void doubleValuesInArray(int *pointer) {
    for (int n = 0; n < 2; n++) {
        int a = *(pointer+n);
        a = a * 2;
        *(pointer+n) = a;
    }
}