【问题标题】:Why can't *pointer+offset be used as an l-value? ("error: non-lvalue in assignment")为什么 *pointer+offset 不能用作左值? (“错误:赋值中的非左值”)
【发布时间】:2012-11-24 19:48:44
【问题描述】:

这是我的代码:

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; 

似乎不起作用。

如果我使用 指针[n] = a; 它也可以。

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

【问题讨论】:

  • 有人可以为这个问题建议一个更好的标题,以便它可以出现在搜索中吗?

标签: c++ arrays pointers syntax


【解决方案1】:

您没有正确地为指针表达式加上括号:* 具有更高的优先级,因此您应该在加法周围添加括号:

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

【讨论】:

  • @nos 使用[] 运算符肯定更干净,这绝对是我在我的代码中要做的。但是,我认为 OP 想具体了解取消引用指针和索引的总和,而不是使用不那么奇特的 [] 选项。
【解决方案2】:

很清楚——*pointer+n 是一个右值——这意味着你不能分配给它。

你是说

*(pointer+n) = a;

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

【讨论】:

    【解决方案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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-12-20
      • 2011-03-04
      • 2013-12-03
      • 2021-05-23
      • 1970-01-01
      • 2017-01-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多