2012-11-24 31 views
1

這裏是我的代碼:爲什麼不能將* pointer + offset用作l值? ( 「錯誤:非左值賦值」)

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中:在功能`無效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;它也適用於 。

爲什麼我的第一種方法不起作用?

+1

可有人建議爲,因此這個問題的一個更好的標題可以出現在搜索中? –

回答

4

你沒有正確地括起您的指針表現形式:*具有更高的優先級,所以你應該添加另外加上括號:

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

我也建議做'pointer [n]'使事情更清晰。 – nos

+1

@nos使用'[]'運算符絕對是更清晰的,這絕對是我在我的代碼中會做的。但是,我認爲操作系統想要詳細瞭解如何解引用一個指針和一個索引的總和,而不是使用不那麼奇特的'[]'選項。 – dasblinkenlight

3

這很清楚 - *pointer+n是一個r值 - 意思是你不能指定它。

您是不是要找

*(pointer+n) = a; 

,因爲兩者是不同的。 *pointer+n只是返回數組的第一個元素並將n添加到它(這是r值的結果)。 *(pointer+n)是第n個元素(l值)。

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; 
    } 
} 
相關問題