2013-11-23 23 views
-2
int main() 
{ 
    int a[]={2,3,4,5,6}; 
    int j; 
    for(j=0;j<5;j++) 
    { 
    printf("%d\n",*a); 
    a++; 
    } 
    return; 
} 

給 「Lvalue需要」 錯誤,但如果將一個數組名稱當作一個指針,爲什麼當增加一個數組時需要Lvalue的編譯時錯誤?

int main() 
{ 
int a[]={2,3,4,5,6}; 
int *p,j; 
p=a; 
for(j=0;j<5;j++) 
{ 
    printf("%d\n",*p); 
    p++; 
} 
return; 
} 

沒有。爲什麼????

+4

數組**不是指針**。作爲一個id表達式,它是一個不可修改的左值。因此,你不能改變它,同樣'a = p;'是被禁止的。請參閱http://stackoverflow.com/q/1641957/420683 – dyp

回答

2

雖然密切相關,arrays are not pointers。數組的名稱只是標識一些已分配內存的標籤(因此,當您嘗試修改它時會出現左值錯誤)。

+2

N.B.一個數組名(作爲一個id表達式)*是一個左值(你可以使用它的地址),但它不可修改(你不能指定一些東西)。 – dyp

+0

你是對的。 –

+1

事實上,數組的名稱是標識某些內存的標籤不是「需要Lvalue」錯誤的原因。事實上,一個標籤標識一些內存實際上是'++'操作符想要的:它想要在一個對象上操作。在'int x'中,'x'是一個'int'的標籤,'x ++'工作得很好。實際的問題是數組自動轉換爲指針,結果只是一個值,而不是一個對象。如果數組沒有自動轉換爲指針,那麼'a ++'會產生錯誤,因爲'a'不可修改,不是因爲它不是左值。 –

1

數組不是指針。在大多數表達式中,數組是自動轉換爲指針。這種轉換的結果不再是數組;它只是一個指針

++操作員無法僅憑一個值操作。它必須有一個行動對象。例如,考慮int x = 3; (x+5)++;x+5的結果是8.它不是x。結果只是一個值,而不是一個對象,所以沒有包含8的對象可以在其上運行。這是一個錯誤。

類似地,如果aint的數組,則a++等於((int *) a)++++並不試圖對a採取行動;它試圖將a轉換爲指針的結果。

數組表達總是轉換成指針的第一個元素,除了當陣列表達是sizeof&,或_Alignof操作數或爲用於初始化數組文本的字符串。

+0

但是當我在一個difffernt程序中使用++運算符遞增數組名稱時,它在其中工作正常 – user2645461

+0

其中我已經將該數組傳遞給其他某個函數,然後遞增它 – user2645461

+0

像void foo(int b [] [ 3]){++ b; b [1] [1] = 9} – user2645461

0

這將顯示所有的陣列數據。

#include <iostream> 
#include <vector> 
#include <stdio.h> 
using namespace std; 

int main() 
{ 
    int a[]={2,3,4,5,6}; 
    int *p,j; 
    p=a; 
    for(j=0;j<5;j++) 
    { 
     printf("%d\n",p[j]); 
    } 
    return 0; 
} 
相關問題