2012-02-27 23 views
1

可能重複:
Lvalue required errorC編程;左值要求

我有我的C程序

main() { 
    int arr[] = {1, 2, 3, 4}; 
    printf("%d", *arr); 
    arr++; 
    printf("%d", *arr); 
} 

一個錯誤,當我編譯此代碼我得到的左值所需錯誤。爲行與ARR ++。 任何幫助!

+8

數組不是指針。指針不是數組。 – 2012-02-27 17:13:33

+1

請顯示最小的整個代碼。而一個數組是一個指針常量,你不能增加該指針。 (你可以將它分配給其他指針並增加其他指針)。 – 2012-02-27 17:13:35

+2

這是功課嗎?因爲它看起來不像你想要做的事情。 – trutheality 2012-02-27 17:14:40

回答

1

++--的前綴和後綴版本的操作數必須是可修改的左值。不幸的是,像arr這樣的數組表達式是-可修改的左值,因此是你的錯誤信息。

如果要使用指針表達式來遍歷數組,則必須聲明第二個指針並將其設置爲指向數組的第一個元素。

int *p = arr; // or &arr[0] - in this context they evaluate to the same thing 
5

arr是一個常數,你不能改變它的值。您可以添加

int *p = arr; 

然後做一個

p++; 
+2

你應該在這裏解釋一下,「arr」不僅僅是一個常量 - 它是一個數組,而不是一個指針。儘管C使得數組和指針看起來很相似,但它們不是同一種東西 - 你不能增加一個數組。 – Perry 2012-02-27 17:47:20

3

您的問題是arr是一個數組,數組不是左值。你需要一個指針。

int arr[] = {1, 2, 3, 4}; 
int *p = &arr; 
printf("%d", *p); 
p++; 
printf("%d", *p); 
+0

是不是&arr一個int **(當然有一個常量)? – zmbq 2012-02-27 17:26:13

+1

@ambq不,它不是。在你的代碼中,你只是利用了'arr'衰變爲'&arr'這一事實。 – 2012-02-27 17:36:49

+0

謝謝,自從我上次編程直C以來已經過了十五年了... – zmbq 2012-02-27 17:56:01

2

lvalue通常指的是賦值(=)運算符左側的值。由於arr++arr = arr + 1的縮寫,因此它就是指它。

基本上,arr是一個數組,並且不支持更改數組的值。我想你想要一個指向數組的指針。指針可以按代碼嘗試的方式遞增。

1

arr是恆定的,你不能改變它的值。

保持簡單,訪問數組是這樣的:

int main (int argc, char *argv[]) { 
    int arr[] = {1, 2, 3, 4}; 
    printf("arr[0] == %d\n", arr[0]); 
    printf("arr[1] == %d\n", arr[1]); 
    printf("arr[2] == %d\n", arr[2]); 
    printf("arr[3] == %d", arr[3]); 

    return 0; 
} 

我推薦了左值和右值this文檔。

而且,這個c-faq關於「數組不是指針」。